1

私は、ここにあるユニットである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;
4

1 に答える 1

2

間違いは、秘密鍵ではなく公開鍵で署名しようとしていることだと思います。暗号化には常に公開鍵(および復号化には秘密)を使用し、署名には秘密鍵(したがって検証には公開鍵)を使用します。

さらに、の正反対のように見えるので、のPEM_read_bio_RSAPrivateKey代わりに使用する方が良いように思われます。非推奨の呼び出しのようであり、PEMエンコーディングを処理する可能性は低いです。EVP_PKEY_assignPEM_write_bio_RSAPrivateKeyEVP_PKEY_assign

于 2012-12-28T23:22:00.330 に答える