多种 OpenSSL RSA 签名方法产生不同的结果

Multiple OpenSSL RSA signing methods produce different results

努力思考签名和 use/test 各种选择。

我可以使用这个命令签名:

openssl dgst -sha256 -sign private_key.pem -binary -out sig_file data_file

但是文档好像说我也可以用这个方法

openssl dgst -sha256 -binary data_file > hash_file
openssl rsautl -sign -inkey private_key.pem -keyform PEM -in hash_file > sig_file2

但是当我期望签名相同时,签名却不同。要么是我遗漏了选项中的某些内容,要么是我的假设有误。

这个问题的真正问题:有没有一种方法可以使用命令行选项进行签名,因为我已经有了哈希值并生成与上面的第一个命令相同的签名。

要添加更多内容,我可以在代码中轻松重现第一个命令,它与上面的第一个命令匹配,这意味着我可以使用首先计算的哈希值进行签名。

mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
EVP_DigestUpdate(mdctx, data, len);
EVP_DigestFinal_ex(mdctx, hash, &s);
EVP_MD_CTX_destroy(mdctx);

kfile = fopen64(key_file, "r");
key = PEM_read_RSAPrivateKey(kfile, NULL, NULL, NULL);
fclose(kfile);

*sig = malloc(RSA_size(key));
RSA_sign(NID_sha256, hash, hlen, *sig, siglen, key);

欺骗:Difference between openSSL rsautl and dgst
密切相关:
Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?
Different signatures when using C routines and openssl dgst, rsautl commands
Signing 20-byte message with 256-bit RSA key working with openssl.exe but not in code
交叉复制:https://superuser.com/questions/943972/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign

TLDRdgst -sign for RSA 做完整的 RSASSA-PKCS1-v1_5:散列数据,在 ASN.1 中编码散列,填充结果,然后调制解调器 D. rsautl -sign 只做最后两个,dgst 只做第一个,因此 跳过编码 产生不同的非标准签名。 dgst(或您自己的散列)然后 pkeyutl -sign 使用 RSA 密钥 -pkeyopt digest:name_of_digest(重要!) 也有效并回答了你真正的问题。