私は、ここにあるユニットであるDelphi用のOpenSSLを実験しています。これまでのところ、公開鍵/秘密鍵を生成することができます。私がやろうとしているのは、文字列に署名してから、その文字列が公開鍵で署名されているかどうかを確認することです。
だから..これが私がこれまでに持っているものです。問題は、EVP_PKEY_assignが常にpKey = nilを返すため、 EVP_SignFinalがアクセス違反を引き起こすことです。そのため、キーはメモリから割り当てられていないと思います。どのように割り当てることができますか。
PS。あなたはコードを許さなければなりませんただのテストです;)
誰かが私が間違っているところを教えてもらえますか?
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;