10.06.2004 13:51:24CryptoApi Ответов: 6
Kiwi
Уважаемые боги шифрования, не мог ли бы вы помочь мне разобраться со следующими проблеммами.
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.

Заранее, огромное спасибо.
 
Ответы:
10.06.2004 14:47:58Вадим
1. Экспортировать ключ надо по схеме DH, об этом есть упоминание в документации СКЗИ Крипто ПРО (см. CPExportKey/CPImportKey в csp_2_0.chm), кроме того, код с реальным ключом DH есть в примерах (export.c в sample2_0.zip).
2. Функции CryptEncryptMessage/CryptDecryptMessage работают с PKCS7 EnvelopedData, а утилитка cryptcp.exe – нет.
10.01.2006 11:33:10nikita
Я, наверное, не очень хорошо формулирую... ответов не появляется ;(
Попробую повторить вопрос:
Есть папка файлов, зашифрованных, все используются в системе электронного

обмена информацией по налоговым отчетам (kontur-extern)... пишу небольшой

такой "предпросмотрщик" на Delphi, на функции CryptDecryptMessage...
итак,
идет "просмотр" первого файла, нормально расшифровывается
идет "просмотр" второго файла, выдается ошибка "Встречено неверное значение

тэга ASN1"
проверяю корректность файлов (что должно получиться на выхлопе я заведомо

точно знаю, сам генерил эти файлы из трех разных софтов, сертификат

получателя естессно тот, который нужен), проверяю утилитой cryptcp.exe, все

нормально, без всякой запинки дешифруется И первый, И второй, И все

собственно остальные файлы.
Недоумеваю.
Анализирую Ваш форум, нахожу подобную проблему и вижу, что она как-то

решается ("...Функции CryptEncryptMessage/CryptDecryptMessage работают с

PKCS7 EnvelopedData, а утилитка cryptcp.exe – нет...")?
Резюмирую вопрос: какие параметры функции CryptDecryptMessage позволят

расшифровать файл, легко-дешифруемый утилитой cryptcp.exe ()?; нужно ли

использовать другие методы расшифровки?; какие?

Спасибо.
P.S. Позволил себе запостить ЭТО дважды: в продолжение своего вопроса и в

продолжение вопроса, на который в свое время давал ответ Вадим.

10.01.2006 12:29:30Kiwi
1. Если шифруете файлы утилитой Cryptcp, то нужно в параметрах указывать ключ -der. Такой файл легко расшифруется функцией CryptDecryptMessage.
2. Попробуйте перед заполнением структуры CRYPT_DECRYPT_MESSAGE_PARA заполнить ее нулями. Мне это помогло при подписи сообщения.
Вот мой пример:
FillChar(pSignPara^, SizeOf(CRYPT_SIGN_MESSAGE_PARA), 0);
10.01.2006 14:51:35nikita
на 1. шифруются файлы "без меня" - некий хитросделаный налоговый софт шифрует, а я разгребай... разработчики тоже хороши, говорят: cryptcp же дешифрует, значит и ты сможешь :), со своей стороны ничего менять не хотят и не будут, про разницу в методах шифрования говорят "ну может быть" и все тут. ;(

на 2. Не, не помогло.
Но все равно спасибо.
11.01.2006 0:26:42nikita
Вот так всегда у меня бывает: задам вопрос, потом смотрю в книгу... Оказалось (ну, мне так кажется) эти файлы у меня некоторые закодированы Base64, а некоторые нет, в этом и разница. Как нашел: в результате экспериментов вызвал предварительно Base64Decode и та ошибка про ASN1 больше не выдается, и размер буфера расшифрованных данных после CryptDecryptMessage точно такой же, как и после cryptcp.exe. Все функции возвращают true, на выхлопе получаю точно такой же, какой нужен, файл по размеру...
НО НЕ ПО СОДЕРЖАНИЮ!!!
Пожалуйста, помогите!
Объясните, почему? Вызываю не тот Base64Decode? А какой ТОТ? Из библиотеки Indy IdBase64Decoder1 выдает невесть что, остальные (много разных накопал) одинаковые по размеру, но разные(!) по содержанию данные... Может после CryptDecryptMessage тоже нужно сделать еще какое-нибудь преобразование ("байт-в-байт")? Может это как-то связано с кодировками 1251, koi, unicode? Или с настройками "Язык и стандарты"? И ведь у cryptcp таких проблем не возникает...

Подскажите, пожалуйста, где искать причину того, что выходные данные после Base64Decode+CryptDecryptMessage нечитаемы, хотя получены без ошибок функций и до байта совпадают по размеру с тем, что получится в результате должно?
11.01.2006 11:53:08Kiwi
Насчет base64: если не использовать ключ -der в cryptcp при шифровании, то на выходе как раз и получается файл зашифрованный + сверху зашифрованный в base64.
По поводу данных: если исходный текст на англицком, то разницы в кодировках нету (младшая часть таблицы символов идентична), если на русском, то может быть, но на него уже смотреть надо...