Правильно ли я делаю? Последовательность действий такая:
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);
И вот на последнем операторе меня выкидывают. Что не так?
СКЗИ КриптоПро 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);