| ||||
| ||||
Господа, помогите! Создал ключевую пару для подписи: CryptGenKey(hProv,CALG_GR3410,CRYPT_EXPORTABLE,&phKey) При экспорте всё проходит нормально, ключ находит, пароль проверяет правильно, но в файл сбрасывает всего два квадратика, в чём ошибка? Вот код для экспорта: HCRYPTPROV hProv=NULL; HCRYPTKEY phKey; BYTE *pbKeyBlob=NULL; DWORD dwBlobLen; AnsiString Container="\\\\.\\REGISTRY\\PIF1299"; char *CONTAINER=Container.c_str(); //Подключаемся к криптопровайдеру if(!CryptAcquireContext(&hProv,CONTAINER,CP_DEF_PROV,PROV_GOST_DH,0))ShowMessage("Connection Error!"); //Получаем дескриптор ключа CryptGetUserKey(hProv,AT_SIGNATURE,&phKey); //Определяем размер буфера для экспорта ключа if(!CryptExportKey(phKey,0,PUBLICKEYBLOB,0,NULL,&dwBlobLen))ShowMessage("SizeError!"); pbKeyBlob=(BYTE *)malloc(dwBlobLen); //Экспортируем ключ if(!CryptExportKey(phKey,0,PUBLICKEYBLOB,0,pbKeyBlob,&dwBlobLen))ShowMessage("ExportError!"); //Сохраняем в файл ofstream key1ofstream("D:\\test.ini"); key1ofstream << pbKeyBlob; key1ofstream.close(); CryptReleaseContext(hProv,0); | ||||
Ответы: | ||||
| ||||
Да, похоже разобрался... сам неверно сохранял в файл... Теперь получается файл размером 164 bytes с какой-то белебердой, похоже на ключ... Вопрос следующий: он такого размера и должен быть, если я не задавал размер ключа при его создании? и второе: Делаем тоже для секретного ключа, выдаёт ошибку... Это ограничения Крипто-Про? | ||||
| ||||
Да, 164 байта для ГОСТ Р 34.10-94 и 100 байт для ГОСТ Р 34.10-2001. Экспорт секретного ключа, как и сессионного ключа, возможен только на ключе парной связи (Диффи-Хеллмана). Пример кода см. в http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=4 | ||||
| ||||
Подскажите, а какой алгоритм для ключа выбрать по ГОСТу, чтобы открытым можно было бы шифровать, а закрытым подписывать. Или такая возможность не предусмотрена и нужны две ключевые пары? Ибо CALG_GR3410 при шифровании файла выдаёт отшибку "NTE_BAD_ALGID". Заранее благодарен... | ||||
| ||||
Шифрование всегда делается на сессионном симметричном ключе (ГОСТ 28147-89) - CALG_G28147 | ||||
| ||||
А как же быть, если отправителю нужно зашифровать файл для длительного хранения и чтобы расшифровать его мог только получатель? Такое по ГОСТу не предусмотрено? | ||||
| ||||
Это косяяяк чувааак :) Сева-сан, ты указателем косо воспользовался. Ты бы уж пихал прямо в тело функции Container.c_str() да и всё, потому как c.str() собственно и возвращает указатель, который тебе нужен. А в твоём случае ты создал указатель не на символьный массив (т.к. просто char вместо char[]) и поэтому в частности - глюки. | ||||
| ||||
Вот уж ты совсем ерунду сказал, братан! | ||||