23.04.2003 14:39:19Правильно ли я делаю? Ответов: 1
Ильшат Абшарипов
Я долго пытался понять, что я делаю неправильно, и так и не понял.

Последовательность действий такая:
1.На стороне получателя генерирую ключ и сохраняю его в файле:

CPGenKey(Provider, AT_KEYEXCHANGE, CRYPT_EXPORTABLE or (KeyLen shl 16), @ExchKey);
CPExportKey(Provider, ExchKey, 0, PUBLICKEYBLOB, 0, nil, @BufferLen);
GetMem(Buffer, BufferLen);
CPExportKey(Provider, ExchKey, 0, PUBLICKEYBLOB, 0, @Buffer, @BufferLen);
CPDestroyKey(Provider, ExchKey);
dlgSave.Execute;
AssignFile(F, dlgSave.FileName);
Rewrite(F, 1);
BlockWrite(F, Buffer, BufferLen);
CloseFile(F);

2. На стороне отправителя я беру файл с сгенерированный на шаге 1 ключом, импортирую его:
GetDataFromFile(dlgOpen, @Buffer, BufferLen);
CPImportKey(Provider, @Buffer, BufferLen, 0, CRYPT_EXPORTABLE, @OpenKey);
CPGenKey(Provider, CALG_G28147, CRYPT_EXPORTABLE or CRYPT_CREATE_SALT, @SessionKey);
BufferLen := 128;
CPExportKey(Provider, SessionKey, OpenKey, SIMPLEBLOB, 0, @Buffer, @BufferLen);

И вот на последнем операторе меня выкидывают. Что не так?

 
Ответы:
23.04.2003 17:00:47Uri
СКЗИ КриптоПро CSP позволяет делать экспорт сессионного ключа (CPExportKey(Provider, SessionKey, OpenKey, SIMPLEBLOB, 0, @Buffer, @BufferLen)) ТОЛЬКО на ключе парной связи Деффи-Хелмана.
Для экспорта сессионного ключа следует выполнить следующие шаги:
· Импорт блоба открытого ключа получателя на своей ключевой паре;
· Экспорт сессионного ключа на ключе парной связи.
CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey);
CPImportKey(hProv, pbRecipentPublicKey, cbRecipentPublicKey, hUserKey, 0, &hExchKey); - здесь у нас будет выработан ключ парной связи Деффи-Хелмана
CPExportKey(hProv, hSessionKey, hExchKey, SIMPLEBLOB, 0, pbSessionKeyForRecipient, &cbSessionKeyForRecipient);

Т.е. для импорта сессионного ключа следует выполнить следующие шаги:
· Импорт блоба открытого ключа отправителя на своей ключевой паре;
· Импорт сессионного ключа на ключе парной связи.

CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPImportKey(hProv, pbSenderPublicKey, cbSenderPublicKey, hUserKey, 0, &hExchKey);
CPImportKey(hProv, pbSessionKeyFromSender, &cbSessionKeyFromSender, hExchKey, 0, &hSessionKey);