[Ответить в тред] Ответить в тред

26/03/16 - Конкурс: Помоги гомункулу обрести семью!
15/10/15 - Набор в модераторы 15.10 по 17.10
27/09/15 - Двач API — Инструкция к применению



[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 50 | 2 | 11
Назад Вниз Каталог Обновить

Шифрование с использованием CryptoAPI Аноним 17/02/16 Срд 12:51:09  657410  
14557026692170.jpg (105Кб, 784x800)
Sup, /pr/!
Я в криптографии почти полный ноль, но тут появилась следующая задача. Есть 2 стороны, назовём их «источник» и «приёмник»; надо обеспечить передачу данных от источника приёмнику, используя смарт-карту. Также есть 2 асимметричных ключа: A — условно «программный», и B — условно «аппаратный».

Данные в источнике сначала шифруются закрытым ключом A, а затем — открытым ключом B. После этого ключ B записывается на смарт-карту (оттого он и «аппаратный»), а открытый ключ A известен приёмнику и служит для предупреждения подделки (вдруг кто-то захочет своим ключом B зашифровать данные, тогда в отсутствии меры предосторожности с использованием ключа A это может сделать кто угодно).
Соответственно, в приёмнике данные расшифровываются закрытым ключом B со смарт-карты, затем открытым ключом A. И тут возникают вопросы:
0. А можно ли будет вообще извлечь закрытый ключ или как-то заставить данные расшифроваться посредством смарт-карты, не отходя от CryptoAPI? Я нарыл CryptAcquireCertificatePrivateKey, но из её описания непонятно — вдруг она на другой машине уже не сможет отдать приватный ключ, потому что "can only be used by the owner of a private key and not by any other user".
1. Вроде как обычно данные шифруют сессионным ключом, который потом передают, зашифровав его асимметричным ключом.
2. Ещё туда можно цифровую подпись прилепить. Это будет вообще пушка!
3. Там могут понадобиться сертификаты. Ну охренеть теперь, придётся ещё и их передавать с данными или ещё где-то.

Моего чтения материалов на тему CryptoAPI (в MSDN и не только) хватило только на общее понимание картины, поэтому моя терминология в изложении данной темы может давать сбои. Я просто строжайше не ебу, в какой последовательности что вызывать, поэтому нужен >-< подробный алгоритм, ибо у меня каша в голове ото всей этой информации. Можем хоть даже последовательно разбирать все шаги в подробностях, чтобы не пришлось писать огромный пост со всем алгоритмом, по которому потом возникнет такой же огромный пост с вопросами.
Аноним 17/02/16 Срд 13:10:17  657425
14557038173860.jpg (10Кб, 200x200)
Судя по вопросам, ты тимлид в сбербанке?
Аноним 17/02/16 Срд 13:17:06  657430
>>657425
На ставке 4к$, у которого есть все кроме мозгов
Аноним 17/02/16 Срд 13:24:38  657436
>>657425
так его!
Аноним 17/02/16 Срд 13:25:14  657437
>>657410 (OP)
пиши фейкомыло - проконсультирую за 2к рублей
дома жрать нечего, лол
Аноним 17/02/16 Срд 13:31:24  657445
>>657425>>657430
К сожалению, вы не угадали.
Аноним 17/02/16 Срд 13:33:41  657446
>>657430
не завидуй, нищеброд
Аноним 17/02/16 Срд 13:59:12  657461
>>657425
Успешные люди не сидят на дваче же
Аноним 17/02/16 Срд 14:08:26  657483
>>657461
Но стиль изложения характерный же. Невнятная постановка задачи типа "угадай что мне нужно", зато по-деловому поставлен план работ:
>нужен >-< подробный алгоритм
>последовательно разбирать все шаги в подробностях, чтобы не пришлось писать огромный пост со всем алгоритмом, по которому потом возникнет такой же огромный пост с вопросами
Аноним # OP  17/02/16 Срд 14:23:15  657502
>>657483
Да я вроде понятно объяснил-то, что в общих чертах понимаю процесс и что интересует, но в тонкостях реализации — каша получается. Описывать привык всё детально, чтобы лишних вопросов не возникало; старался ничего не упустить.
А как тогда надо было бы написать?
Аноним 17/02/16 Срд 14:28:19  657509
>>657502
Да никак, чувак. Самому надо разбираться. Тут у тебя нетривиальная задача, и ты фактически просишь все за тебя сделать, ну разве что код ты под диктовку сам запишешь.
Аноним 17/02/16 Срд 14:33:06  657511
>>657509
Ну вообще-то нет. А что в задаче нетривиального? Как бы понимающие люди (которые пока не я) без проблем смогут рассказать про корректную последовательность операций шифрования, а уж конкретика реализации (например, с какими ключами я буду это делать) — уже другой вопрос. Ясен перец, программу за меня я просить никого не буду написать, но без понимания всей сути этого не сделать.
У меня просто даже идей нет, как всё это совместить, потому как практики 0. То есть инициализировать криптопровайдер я умею, ключи генерировать — тоже, а дальше — тёмный лес.
Аноним 17/02/16 Срд 15:56:28  657569
>>657410 (OP)
пиши фейкомыло - проконсультирую за 10к рублей
дома винт наебнулся, лол
Аноним 17/02/16 Срд 16:05:30  657576
>>657437>>657569
Многовато чёт, да и не надо мне за деньги
И фейкомыла нет
Аноним # OP  18/02/16 Чтв 10:54:50  658221
Посоветуйте хотя б годных книг по прикладному использованию CryptoAPI тогда. Если на русском — хорошо, на английском — тоже ничего страшного.
Аноним 18/02/16 Чтв 12:51:48  658291
>>658221
>CryptoAPI
оно не секурно для тех целей, что ты ставишь

это была демо-версия консультации, далее - фейкомыло и 2к
Аноним 18/02/16 Чтв 13:51:37  658364
>>658291
Чому несекурно?
Это какой-то новый тренд на дваче — писать таким образом про деньги? Просто давно не бывал, а здесь зашёл, и вдруг такое.
Аноним 18/02/16 Чтв 20:09:55  658919
>>658364
если пека под твоим контролем, то секурно.

>>658291
я его консультирую за 10, а тебе 2к, так отъебешся? ок?
Аноним 18/02/16 Чтв 21:07:13  658978
> шифруются закрытым ключом A
Это и есть подпись.
> CryptoAPI
Не знаю.
Аноним 19/02/16 Птн 06:13:37  659258
>>658919
>если пека под твоим контролем, то секурно.

если пека 100% под твоим контролем то и смарткарта не нужна. если же ты не уверен насчёт подконтрольности пека то схема не взлетает

делим так: мне 8к, тебе 2к
Аноним # OP  19/02/16 Птн 08:52:55  659267
>>658364>>659258
Целевой пека не под моим, для того и нужна смарт-карта.
Аноним 20/02/16 Суб 11:45:00  660805
Такой вопрос: генерирую я асимметричные ключи с помощью CryptGenKey, передавая туда AT_KEYEXCHANGE или AT_SIGNATURE. Да, я понимаю, что AT_KEYEXCHANGE может также и для подписи использоваться, но если абстрагироваться от этого, то какая между ними разница? (0)
Далее, если я хочу на будущее сохранить оба ключа, то мне надо, во-первых, сгенерировать оба (ибо процесс генерации одного независим от другого) и по отдельности экспортировать? (1)
Аноним 20/02/16 Суб 17:08:48  661084
>>658978
>> шифруются закрытым ключом A
>Это и есть подпись.
сначала берется хеш от данных, а хеш уже шифруется закрытым ключом, это будет подпись
делается это для того, чтобы ускорить операцию - ассимметричное шифрование затратная операция
Аноним 20/02/16 Суб 17:21:55  661087
а, понятно, чего тупит оп
дак смысл этих аппаратных решений в том заключается, чтобы была возможность на условно небезопасных машинах использовать закрытый ключ
а общий механизм действия такой - что, собственно, применение закрытого ключа (либо расшифровка полученых данных, либо формирование с его помощью цифровой подписи) происходит на самом устройстве
в твоем случае cryptoapi будет просто передавать зашифрованную информацию на устройство с приватным ключом, где она будет расшифровываться и отдаваться обратно на машину
ну а проверка цифровой подписи полученых данных будет производится на самой машине, где будет хранится открытый ключ - ведь за его безопасность можно не беспокоится, в этом и смысл открытого ключа
"сертификат" же это обычно просто такой контейнер (по сути, файл), где могут лежать либо открытый, либо закрытый ключ, либо оба вместе и обычно поверку он еще закрыт электронной подписью центра сертификации (на самом деле могут быть еще сложнее случаи)
и потом есть еще "хранилища" где могут лежать эти сертификаты - в конце концов это будет либо какая-то база данных, либо папка на компе, либо это будет хранится на каком-то специализированном аппаратном устройстве
Аноним 20/02/16 Суб 17:33:41  661101
>Вроде как обычно данные шифруют сессионным ключом, который потом передают, зашифровав его асимметричным ключом.
тебя, как прикладного программиста, всего лишь использующего api, не должны волновать такие вопросы
но, да, в потрохах библиотек шифрования так и делается
потому что само по себе ассимметричное шифрование - трудозатратная операция, поэтому для цифровой подписи сначала делается хэш, а хэш уже шифруется закрытым ключом, а для ассимметричного шифрования сначала данные шифруются каким-то симметричным алгоритмом, используя для этого сессионный ключ, а сам ключ, уже в свою очередь шифруется открытым ключом
в обоих случаях есть куча нюансов, и если есть на двачах люди, что пишут потроха криптухи, они меня могут поправить, но я только ее использую
Аноним 20/02/16 Суб 17:39:00  661106
>А можно ли будет вообще извлечь закрытый ключ или как-то заставить данные расшифроваться посредством смарт-карты, не отходя от CryptoAPI? Я нарыл CryptAcquireCertificatePrivateKey, но из её описания непонятно — вдруг она на другой машине уже не сможет отдать приватный ключ, потому что "can only be used by the owner of a private key and not by any other user".
повторюсь, ты, похоже не понимаешь самого смысла аппаратного решения - оно на то и надо, чтобы сохранить приватность закрытого ключа на условно небезопасных машинах
а обеспечивается это тем, что собственно, операции по дешифрованию или формированию цифровой подписи будут происходить на самом устройстве где и хранится закрытый ключ, а cryptoapi (либо какое-то другое стороннее криптографическое решение) будет всего лишь передавать туда нужные данные и получать их расшифрованными или подписаными
таким образом что получается: что условный злоумышленник, получив управление машиной, сможет таки выполнять какое-то время криптографические операции используя закрытый ключ, но не сможет получить сам закрытый ключ
все ОЧЕ просто
Аноним 20/02/16 Суб 17:43:11  661110
>>657502
>что в общих чертах понимаю процесс
нет, судя по твоему посту ты НИХУЯ не понимаешь еще в теме, не обманывай себя
Аноним 20/02/16 Суб 17:46:04  661113
>>657509
>Тут у тебя нетривиальная задача
ага, заключающаяся в вызове двух стандартных функций из cryptoapi -
отправить на расшифровку на смарт карту где лежит закрытый ключ
проверить цифровую подпись открытым ключом, лежащим на компе
Аноним 20/02/16 Суб 17:54:35  661117
Начну наоборот
>>661110
Да, чувак, ты прав!
И смысл аппаратного решения я таки понимаю — чтобы закрытый ключ не извлекли из защищённых контейнеров с целевого компа (ибо они не такие уж и защищённые), процедуры работы с закрытым ключом делаются в самом устройстве. В ближайшее время накидаю простейший шифратор-дешифратор; надеюсь, взлетит (но у меня ни хрена не взлетит, конечно же, кого я обманываю)
>>661101
>тебя, как прикладного программиста, всего лишь использующего api, не должны волновать такие вопросы
Как я понял из описания процесса, сессионный ключ сам себя не сгенерирует, и не педераст передаст себя в зашифрованном виде тоже.
>>661087
>"сертификат" же это обычно просто такой контейнер (по сути, файл), где могут лежать либо открытый, либо закрытый ключ, либо оба вместе
Видимо, я очень плохо прочитал раздел про сертификаты, потому что думал, что там только открытый ключ хранится (ну и плюс данные по самому сертификату). Типа потому что закрытый хранить несекурно же.

Кстати, спасибо за ответы. Кое-что стало более понятно, чем после чтения MSDN'а на эту тему.
Аноним 20/02/16 Суб 18:12:02  661126
>>661117
>я очень плохо прочитал раздел про сертификаты
читай про центры сертификации, хранилища сертификатов, подпись центра сертификации
да что там говорить - на самом простом уровне в твоем браузере уже есть хранилище сертификатов, в нем куча сертификатов, ты можешь посмотреть, какие ключи в них лежат, каким центром сертификации они заверены (подписаны), срок их действия
Аноним 20/02/16 Суб 18:20:34  661133
>>661126
Скорее, даже не в браузере, а в хранилище системы — ведь эти сертификаты не ему одному могут быть нужны. Браузер-то оттуда берёт, насколько мне известно (взять хотя бы IE и Chrome-based браузеры).
Но мне сертификаты нужны постольку-поскольку; для реализации моего двойного шифрования они необязательны же?
Кстати, до этого думал, а не забить ли мне данные просто в сертификат и использовать их уже, но потом чёт отдумался от этой мысли. Вдруг можно и без работы с сертификатами обойтись.

P.S. В прошлый раз забыл подписаться, да. Но оно и так понятно вроде.
А на дваче, по ходу, криптуют только единицы.
Аноним 20/02/16 Суб 18:52:54  661152
>>661133
cryptoapi - это ж в первую очередь стандартизирующий промежуточный слой от майкрософт
дык и я не очень понимаю, через какой криптопровайдер ты собираешься работать? какой то сторонний (возможно наших русских разрабов с русскими алгоритмами) либо один из предлагаемых майкрософт? какой из криптопровайдеров поддерживат твое аппаратное решение
Аноним 20/02/16 Суб 19:08:15  661171
>>661152
Ну я смотрел всякие CryptoPro, например. Конкретного на примете нет, но отвечая на твой вопрос в общем — работать собираюсь через MS-провайдеры, но распространённые, которые и наши аппаратные ключи поддерживают (т.е. RSA, ГОСТ не нужен).
Аноним 20/02/16 Суб 19:16:12  661182
>>661171
че за смарт карта? какая фирма?
смотришь, какие алгоритмы она поддерживает, какие стандарты ключей держит, в каких форматах
от этого и стоит плясать
ну а в твоем коде конкретно будет вызов двух функций и все

Аноним 20/02/16 Суб 19:23:06  661188
>>661182
Ладно, я много языком руками треплю, сейчас накидаю примерно, как я вижу простое шифрование-дешифрование. Потому что у меня есть очень большие сомнения в некоторых моментах, а правильно ли я понял кое-что, но если напишу, то сомнения могут и развеяться (а могут и укрепиться, лол).

По картам пока нет конкретики, но я же правильно понимаю, что если она поддерживает RSA, то при работе с ней через MS CryptoAPI проблем возникнуть не должно, как будто я с обычным хранилищем ключей работаю?
Аноним 20/02/16 Суб 19:47:34  661216
В источнике я:
получаю контекст провайдера, генерирую асимметричный А и сеансовый Б ключи;
записываю ключ А в хранилище;
считаю хэш данных, шифрую их ключом Б, а хэш — открытым А;
записываю зашифрованный хэш, ключ Б и зашифрованные данные и отправляю их. На этом со стороной источника покончено;
уничтожаю всю созданную ебалу, ну т.е. корректно завершаю работу с криптопровайдером.

В приёмнике я:
получаю контекст провайдера;
каким-то магическим образом получаю дескриптор закрытого ключа А (не сам ключ, естественно), дешифрую им хэш, ключом Б дешифрую данные и сверяю хэши;
если всё успешно, продолжаю работу, если нет — форматирую негодному пользователю диск C:, и завершаю работу с криптопровайдером.

Всё верно, или я где-то написал херню?
Аноним 20/02/16 Суб 19:48:34  661217
>>661216
Объебался с разметкой, ну да ладно.
Аноним 20/02/16 Суб 19:50:33  661218
>>661188
>с обычным хранилищем ключей работаю
криптографическая смарт карта это не "обычное" хранилище ключей - это активное устройство, которое само производит операции с данными используя ключи, хранящиеся в ним (а возможно им же самим и сгенерированные)
второе, конкретное устройство может поддерживать работу с ключами в определенных форматах, например, это будут ключи в виде цифровых сертификатов формата X.509, а может быть что то другое
Аноним 20/02/16 Суб 20:00:57  661227
>>661084
Далеко не только за этим. В системах где одна пара используется для подписи и шифрования, хеширование позволяет избежать раскрытия зашифрованной информации через подпись.
Алсо, хеширование всё равно необязательно для подписи.
Аноним 20/02/16 Суб 20:04:16  661233
>>661133
Браузер таки использует своё хранилище сертификатов, а вот хромоподелия лезут в системное.
Аноним 20/02/16 Суб 20:07:05  661240
>>661216
ничего этого ты не делаешь, тк ты прикладной программист
тебе нужно один раз сгенерить ключевую пару (в каком-то формате они будут, в виде цифрового сертификата) - либо ты ее сгенеришь используя криптопровайдер напрямую, а потом положишь закрытый ключ в смарткарту, либо ключевую пару сгенерит смарткарта, из нее ты возьмешь открытый ключ, а закрытый будет в ней хранится
на сервере перед отправкой данный ты вызовешь одну-единственную функцию криптоапи, которая зашифрует данные используя открытый ключ клиента
на клиенте ты вызовешь функцию криптоапи, которая расшифрует данные, но криптопровайдер не будет это делать сам, а только передаст эти данные дальше, в смарткарту, которая, используя закрытый ключ расшифрует данные и отдаст их криптопровайдеру
это если ты хочешь испльзовать только шифрование, если еще хочешь делать цифровую подпись, то нужно сгенерировать еще одну ключевую пару (для сервера уже)
Аноним 20/02/16 Суб 20:12:43  661243
>>661240
В принципе, ЦП не нужна. Но это я очень подробно расписал, на плюсах же пишу. Опять же, одной функцией тут не обойтись. Я как раз описал 1-й вариант, когда криптопровайдер генерирует, а потом я сам кладу в смарт-карту.
Только у меня не клиент-серверная архитектура, на стороне «источника» я генерирую файл, а он передаётся вместе со смарт-картой «приёмнику», который уже будет пользоваться данными, зашифрованными тем ключом. Изменять он их не должен, и свои генерировать и подписывать — тоже.
Аноним 21/02/16 Вск 21:24:20  662356
Не тони!
Аноним 22/02/16 Пнд 12:32:12  662860
Решил сделать простейший шифратор-дешифратор. Создал хранилище для постоянной ключевой пары, сгенерировал сеансовый ключ, и… теперь не знаю, как зашифровать данные публичным ключом из хранилища!
В CryptEncrypt и CryptEncryptMessage я не нашёл параметра, который отвечает за то, чтобы шифрование осуществлялось публичным ключом (наверняка ведь приватным осуществляет, сука), CryptProtectData вообще только в рамках одного компьютера. Как зашифровать сообщение с помощью приватного ключа?
Аноним 22/02/16 Пнд 12:32:42  662861
>>662860
> с помощью приватного ключа?
Публичного, конечно, я имел в виду.
Аноним 23/02/16 Втр 16:15:26  663889
Вот что нашёл https://msdn.microsoft.com/en-us/library/windows/desktop/aa386972
Вроде пишут, что в «источнике» шифруется с помощью открытого ключа, а в «приёмнике» расшифровывается с помощью закрытого. Пилю пока что прогу, попутно пытаясь понять встречающиеся ошибки.
Результаты эксперимента ОП 25/02/16 Чтв 20:58:14  666732
Наконец-то добрался до сюда. Итак, что у меня вышло:
— в источнике сгенерировал асимметричный ключ, экспортировал его;
— сгенерировал сессионный ключ;
— экспортнул его, зашифровав (если верить документаци) публичным ключом из пары;
— зашифровал полученным сессионным ключом исходное сообщение, записав туда зашифрованный сессионный ключ;
— в приёмнике импортировал сохранённый ключ;
— извлёк из сообщения зашифрованный сессионный ключ, расшифровав его (опять же, согласно документации) приватным ключом;
— расшифровал сообщение полученным сессионным ключом.
Всё работает даже на разных компьютерах, но оно и неудивительно — ключевую пару я туда импортирую, что в реальной ситуации случаться не должно — приватный ключ должен будет храниться на смарт-карте, например.
Поэтому вопрос — будет ли в случае со смарт-картой всё работать также, отправит ли CryptoAPI весь процесс расшифровки приватным ключом во внутренности карты?
Потому что если этот подход неверен, придётся искать другой путь.
Аноним # OP  29/02/16 Пнд 09:01:22  670851
Ну же, анон, я уверен, что ты знаешь! Если не работал со смарт-картами, то хотя бы в теории можешь ответить.
Аноним # OP  03/03/16 Чтв 12:41:04  674179
>>661113
А как отправить-то? Вот в чём вопрос. Мой алгоритм из >>666732 подойдёт, или его придётся генно-модифицировать?
Аноним 03/03/16 Чтв 13:04:07  674193
>>670851
>Ну же, анон, я уверен, что ты знаешь! Если не работал со смарт-картами, то хотя бы в теории можешь ответить.
тебе же объявили цену, дебилушка
Аноним 03/03/16 Чтв 13:05:26  674194
>>674193>>657576
>да и не надо мне за деньги
Может, это какой-то новый прекол такой. Но мне пофиг.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 50 | 2 | 11
Назад Вверх Каталог Обновить

Топ тредов