| ||||
| ||||
Я долго пытался понять, что я делаю неправильно, и так и не понял. Последовательность действий такая: 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); | ||||