1

我正在为 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;
4

1 回答 1

2

我认为错误在于您尝试使用公钥而不是私钥进行签名。您总是使用公钥进行加密(和私钥进行解密)和私钥进行签名(因此公钥进行验证)。

此外,在我看来,最好使用PEM_read_bio_RSAPrivateKey而不是EVP_PKEY_assign,因为它似乎与PEM_write_bio_RSAPrivateKey. EVP_PKEY_assign似乎是一个不推荐使用的调用,并且不太可能处理 PEM 编码。

于 2012-12-28T23:22:00.330 回答