11.11.2004 13:16:55Экспорт ключа в файл Ответов: 7
Всеволод
Господа, помогите!
Создал ключевую пару для подписи:
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);
 
Ответы:
11.11.2004 16:55:22Всеволод
Да, похоже разобрался... сам неверно сохранял в файл... Теперь получается файл размером 164 bytes с какой-то белебердой, похоже на ключ...
Вопрос следующий:
он такого размера и должен быть, если я не задавал размер ключа при его создании?
и второе: Делаем тоже для секретного ключа, выдаёт ошибку... Это ограничения Крипто-Про?
11.11.2004 17:45:12Василий
Да, 164 байта для ГОСТ Р 34.10-94 и 100 байт для ГОСТ Р 34.10-2001.
Экспорт секретного ключа, как и сессионного ключа, возможен только на ключе парной связи (Диффи-Хеллмана). Пример кода см. в http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=4
11.11.2004 19:39:44Всеволод
Подскажите, а какой алгоритм для ключа выбрать по ГОСТу, чтобы открытым можно было бы шифровать, а закрытым подписывать.
Или такая возможность не предусмотрена и нужны две ключевые пары?
Ибо CALG_GR3410 при шифровании файла выдаёт отшибку "NTE_BAD_ALGID".
Заранее благодарен...
12.11.2004 10:17:14Василий
Шифрование всегда делается на сессионном симметричном ключе (ГОСТ 28147-89) - CALG_G28147
12.11.2004 12:51:04Всеволод
А как же быть, если отправителю нужно зашифровать файл для длительного хранения и чтобы расшифровать его мог только получатель?
Такое по ГОСТу не предусмотрено?
19.11.2004 23:11:15bLeArrEaZ0N
Это косяяяк чувааак :)
Сева-сан,
ты указателем косо воспользовался.
Ты бы уж пихал прямо в тело функции Container.c_str() да и всё, потому как c.str() собственно и возвращает указатель, который тебе нужен. А в твоём случае ты создал указатель не на символьный массив (т.к. просто char вместо char[]) и поэтому в частности - глюки.
19.11.2004 23:18:45KRAUZER
Вот уж ты совсем ерунду сказал, братан!