Генерирую и экспортирую в файлы приватный и публичный ключи
var
pbuf:tstringstream;
buflen:dword;
pass:ansistring;
begin
CryptAcquireContext( @RSA, PWideChar('my_container'), nil, PROV_RSA_FULL, 0 );
CryptGenKey(RSA, AT_KEYEXCHANGE, (1024 shl 16) or CRYPT_EXPORTABLE, @ExchangeKey);
pass := 'password';
CryptCreateHash(RSA, CALG_SHA, 0, 0, RSA_Hash);
try
CryptHashData(RSA_Hash, PByte(pass), Length(pass), 0);
CryptSignHash(RSA_Hash, AT_KEYEXCHANGE, nil,0,nil,@buflen);
finally
CryptDestroyHash(RSA_Hash);
end;
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Seek(0, soBeginning);
pbuf.SaveToFile('public.key');
pbuf.Free;
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Seek(0, soBeginning);
pbuf.SaveToFile('private.key');
pbuf.Free;
CryptDestroyKey(ExchangeKey);
CryptReleaseContext( RSA, 0 );
end;
Далее импортирую приватный ключ (публичный внутри него)
var
pbuf:tstringstream;
i,buflen:dword;
begin
if not FileExists(APP_PATH + 'private.key') then Exit;
CryptAcquireContext( @RSA, PWideChar('my_container'), nil, PROV_RSA_FULL, 0 );
pbuf := tstringstream.Create;
pbuf.LoadFromFile('private.key');
buflen := pbuf.Size;
if CryptImportKey(RSA,PByte(pbuf.Memory),buflen,0,0,@ExchangeKey) then
begin
pbuf.Free;
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Free;
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Seek(0, soBeginning);
pbuf.Free;
CryptDestroyKey(ExchangeKey);
CryptReleaseContext( RSA, 0 );
end;
end;
При генерации я вижу:
публичный ключ:
0602000000A40000525341310004000001000100...
приватный ключ:
0702000000A40000525341320004000001000100...
При импорте только приватного ключа (публичный внутри него) я вижу:
публичный ключ:
0602000000A40000525341310004000001000100...
приватный ключ:
0702000000000000000000000000000000000000...
Подскажите, где и что не так делаю? Почему импорт приватного ключа работает (судя по ипортированному публичному) но сам приватный обнулён?