Экспорт/импорт сессионного ключа

Публикация: 06 Май 2010 - 17:51, редакция: 15.07.2015 15:01

Правильно ли я делаю? Последовательность действий такая:

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);