18.04.2003 15:12:37всеми любимый NTE_BAD_KEY_STATE Ответов: 1
Ильшат Абшарипов
Подобный вопрос уже пробегал на форуме, однако, сколько я не смотрел, не понимаю, в чем ошибка. Код такой (Delphi)
var
Provider: HCryptProv;
ProvVTable: VTableProvStruc;
BufferLen: Integer;
Buffer: array [0..511] of Byte;
OpenKey, SessionKey: HCRYPTKEY;
begin
ProvVTable.Version := 1;
ProvVTable.FuncVerifyImage := nil;
ProvVTable.FuncReturnhWnd := nil;

if not CPAcquireContext(@Provider, nil, 0, @ProvVTable) then
raise ECryptException.Create(’Открытие контейнера ключей для шифрования’, getLastError);
//считывем открытый ключ получателя из файла
if not GetDataFromFile(dlgOpen, @Buffer, BufferLen) then
raise ECryptException.Create(’Открытие файла открытого ключа получателя’, getLastError);
//импортируем его
if not CPImportKey(Provider, @Buffer, BufferLen, 0, 0, @OpenKey) then
raise ECryptException.Create(’Импорт открытого ключа получателя’, getLastError);
//создаем ключ сессии
if not CPGenKey(Provider, CALG_G28147, CRYPT_EXPORTABLE, @SessionKey) then
raise ECryptException.Create(’Создание ключа сессии’, getLastError);
//добавляем его в открытый ключ
BufferLen := 128;
if not CPExportKey(Provider, SessionKey, OpenKey, SIMPLEBLOB, 0, @Buffer, @BufferLen) then
raise ECryptException.Create(’Экспорт ключа’, getLastError);
И вот на последнем операторе возникает сабж. Что делать, как жить дальше?
 
Ответы:
18.04.2003 16:28:52Uri
Да, такой вопрос уже был.
Повторяем ответ...
Экспорт сессионного ключа можно сделать ТОЛЬКО на ключе Деффи-Хелмана.