| ||||
| ||||
Уважаемые боги шифрования, не мог ли бы вы помочь мне разобраться со следующими проблеммами. 1. Пытаюсь экспортировать ключ для того, чтобы потом зашифровать данные. Вот код на Delphi: hProv:= 0; hKey:= 0; hXchgKey:= 0; pbKeyBlob:= nil; // Get handle to the default provider. if not CryptAcquireContext(hProv, PChar(’Kiwi’),// Kiwi - это имя ключевого контейнера. Он на самом деле существует и подключен. PChar(’Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider’), 75, 0)then ShowMessage(’Error %x during CryptAcquireContext!\n ERROR:’+IntToStr(GetLastError)); // Get handle to key exchange key. if not CryptGetUserKey(hProv, AT_KEYEXCHANGE{AT_SIGNATURE}, hXchgKey) then ShowMessage(’Error %x during CryptGetUserKey!\n ERROR: ’+ IntToStr(GetLastError)); if not CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, hKey) then ShowMessage(’Error during CryptGenKey: ’ + GetLastErrorMessage); // if CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, nil, dwKeyBlobLen) then // begin .... CryptExportKey возвращает ошибку ’Плохой ключ’. Чем же он плох? Во всех примерах, которые я видел, делается именно так. И что мне надо сделать, чтобы функция выполнялась? 2. Шифрую файлик функцией CryptEncryptMessage. Получаю файл размером 582б (исходный - 171б). Далее расшифровываю его при помощи cryptcp.exe. Получаю исходный файл. А вот если шифрую утилитой cryptcp.exe, получаю файл размером 797 байт. И при попытке расшифровать его функцией CryptDecryptMessage возникает ошибка ’Встречено неверное значение тэга ASN1’. Подскажите, пожалуйста, чем обусловлена разница в размере зашифрованных файлов и как мне расшифровать файл, полученный после шифрования утилитой cryptcp.exe. Заранее, огромное спасибо. | ||||
Ответы: | ||||
| ||||
1. Экспортировать ключ надо по схеме DH, об этом есть упоминание в документации СКЗИ Крипто ПРО (см. CPExportKey/CPImportKey в csp_2_0.chm), кроме того, код с реальным ключом DH есть в примерах (export.c в sample2_0.zip). 2. Функции CryptEncryptMessage/CryptDecryptMessage работают с PKCS7 EnvelopedData, а утилитка cryptcp.exe – нет. | ||||
| ||||
Я, наверное, не очень хорошо формулирую... ответов не появляется ;( Попробую повторить вопрос: Есть папка файлов, зашифрованных, все используются в системе электронного обмена информацией по налоговым отчетам (kontur-extern)... пишу небольшой такой "предпросмотрщик" на Delphi, на функции CryptDecryptMessage... итак, идет "просмотр" первого файла, нормально расшифровывается идет "просмотр" второго файла, выдается ошибка "Встречено неверное значение тэга ASN1" проверяю корректность файлов (что должно получиться на выхлопе я заведомо точно знаю, сам генерил эти файлы из трех разных софтов, сертификат получателя естессно тот, который нужен), проверяю утилитой cryptcp.exe, все нормально, без всякой запинки дешифруется И первый, И второй, И все собственно остальные файлы. Недоумеваю. Анализирую Ваш форум, нахожу подобную проблему и вижу, что она как-то решается ("...Функции CryptEncryptMessage/CryptDecryptMessage работают с PKCS7 EnvelopedData, а утилитка cryptcp.exe – нет...")? Резюмирую вопрос: какие параметры функции CryptDecryptMessage позволят расшифровать файл, легко-дешифруемый утилитой cryptcp.exe ()?; нужно ли использовать другие методы расшифровки?; какие? Спасибо. P.S. Позволил себе запостить ЭТО дважды: в продолжение своего вопроса и в продолжение вопроса, на который в свое время давал ответ Вадим. | ||||
| ||||
1. Если шифруете файлы утилитой Cryptcp, то нужно в параметрах указывать ключ -der. Такой файл легко расшифруется функцией CryptDecryptMessage. 2. Попробуйте перед заполнением структуры CRYPT_DECRYPT_MESSAGE_PARA заполнить ее нулями. Мне это помогло при подписи сообщения. Вот мой пример: FillChar(pSignPara^, SizeOf(CRYPT_SIGN_MESSAGE_PARA), 0); | ||||
| ||||
на 1. шифруются файлы "без меня" - некий хитросделаный налоговый софт шифрует, а я разгребай... разработчики тоже хороши, говорят: cryptcp же дешифрует, значит и ты сможешь :), со своей стороны ничего менять не хотят и не будут, про разницу в методах шифрования говорят "ну может быть" и все тут. ;( на 2. Не, не помогло. Но все равно спасибо. | ||||
| ||||
Вот так всегда у меня бывает: задам вопрос, потом смотрю в книгу... Оказалось (ну, мне так кажется) эти файлы у меня некоторые закодированы Base64, а некоторые нет, в этом и разница. Как нашел: в результате экспериментов вызвал предварительно Base64Decode и та ошибка про ASN1 больше не выдается, и размер буфера расшифрованных данных после CryptDecryptMessage точно такой же, как и после cryptcp.exe. Все функции возвращают true, на выхлопе получаю точно такой же, какой нужен, файл по размеру... НО НЕ ПО СОДЕРЖАНИЮ!!! Пожалуйста, помогите! Объясните, почему? Вызываю не тот Base64Decode? А какой ТОТ? Из библиотеки Indy IdBase64Decoder1 выдает невесть что, остальные (много разных накопал) одинаковые по размеру, но разные(!) по содержанию данные... Может после CryptDecryptMessage тоже нужно сделать еще какое-нибудь преобразование ("байт-в-байт")? Может это как-то связано с кодировками 1251, koi, unicode? Или с настройками "Язык и стандарты"? И ведь у cryptcp таких проблем не возникает... Подскажите, пожалуйста, где искать причину того, что выходные данные после Base64Decode+CryptDecryptMessage нечитаемы, хотя получены без ошибок функций и до байта совпадают по размеру с тем, что получится в результате должно? | ||||
| ||||
Насчет base64: если не использовать ключ -der в cryptcp при шифровании, то на выходе как раз и получается файл зашифрованный + сверху зашифрованный в base64. По поводу данных: если исходный текст на англицком, то разницы в кодировках нету (младшая часть таблицы символов идентична), если на русском, то может быть, но на него уже смотреть надо... | ||||