我正在为 Delphi 试验 OpenSSL,您可以在此处找到一个单元。到目前为止,我能够生成公钥/私钥。我要做的是签署一个字符串,然后检查该字符串是否用公钥签名。
所以..这是我到目前为止所拥有的。问题是EVP_SignFinal导致访问冲突,因为EVP_PKEY_assign总是返回 pKey = nil 所以我猜密钥不是从内存中分配的,我该如何分配它。
附言。您必须原谅代码只是一个测试;)
有人能指出我错在哪里吗?
var
rsa : pRSA;
eu : string;
privateKey,publicKey,Err : pBIO;
enc : pEVP_CIPHER;
keylen : Cardinal;
prv,pub : PChar;
hash : TMD5Digest;
mdctx : EVP_MD_CTX;
pkey : pEVP_PKEY;
lbuf : array [0..15] of Byte;
i : Integer;
begin
ERR_load_crypto_strings;
OpenSSL_add_all_algorithms;
OpenSSL_add_all_ciphers;
OpenSSL_add_all_digests;
eu := 'SIGN THIS';
enc := EVP_des_ede3_cbc;
rsa := RSA_generate_key(1024,RSA_F4,nil,Err);
if rsa <> nil then
begin
privateKey := BIO_new(BIO_s_mem);
PEM_write_bio_RSAPrivateKey(privateKey,rsa,enc,nil,0,nil,PChar('0PC0DE'));
publicKey := BIO_new(BIO_s_mem);
PEM_write_bio_RSAPublicKey(publicKey,rsa);
keylen := BIO_pending(privateKey);
GetMem(prv,keylen + 1);
BIO_read(privateKey,prv,keylen);
keylen := BIO_pending(publicKey);
GetMem(pub,keylen + 1);
BIO_read(publicKey,pub,keylen);
Writeln(prv);
Writeln('Keys generated!');
pKey := nil;
EVP_PKEY_assign(pkey,EVP_PKEY_RSA,pub);
EVP_MD_CTX_init(@mdctx);
EVP_SignInit(@mdctx,EVP_md5());
EVP_SignUpdate(@mdctx,PChar(eu),Length(eu));
EVP_SignFinal(@mdctx,@lbuf,keylen,pkey);
EVP_MD_CTX_cleanup(@mdctx);
WriteLn(keylen);
Readln;
end;
end;