2

到目前为止,我已经看到了使用 OpenSSL 进行 RSA 签名的两种不同方法:
使用EVP_PKEY_sign

 ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */);
 if (!ctx)
     /* Error occurred */
 if (EVP_PKEY_sign_init(ctx) <= 0)
     /* Error */
 if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
     /* Error */
 if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) <= 0)
     /* Error */

 /* Determine buffer length */
 if (EVP_PKEY_sign(ctx, NULL, &siglen, md, mdlen) <= 0)

使用EVP_DigestSignInit

if(1 != EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, key)) 
          goto err;
if(1 != EVP_DigestSignUpdate(mdctx, msg, strlen(msg))) 
          goto err;
if(1 != EVP_DigestSignFinal(mdctx, NULL, slen)) 
          goto err;
if(!(*sig = OPENSSL_malloc(sizeof(unsigned char) * (*slen)))) 
          goto err;
if(1 != EVP_DigestSignFinal(mdctx, *sig, slen)) 
          goto err;

这只是做同一件事的两种不同方式吗?

4

1 回答 1

4

哦。有相当大的区别。

EVP_PKEY_sign() 不对要签名的数据进行哈希处理,因此通常用于对摘要进行签名。要签署任意消息,请参阅 EVP_DigestSignInit(3)

根据https://wiki.openssl.org/index.php/Manual:EVP_PKEY_sign(3)

所以 EVP_PKEY_sign 很可能在 EVP_Digest SignInit 的后台使用,并且适用于调用者手动格式化要签名的块的应用程序。

于 2017-12-11T13:22:42.107 回答