尝试围绕签名并使用/测试各种选项。
我可以使用此命令进行签名:
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);
答案 0 :(得分:2)
杜佩: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
Crossdupe:https://superuser.com/questions/943972/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign
TLDR :dgst -sign
对于RSA执行完整的RSASSA-PKCS1-v1_5:对数据进行散列,对ASN.1中的散列进行编码,填充结果和modexp d。 rsautl -sign
仅执行最后两个,dgst
仅执行第一个,因此跳过编码生成不同的非标准签名。 dgst
(或您自己的哈希值)然后 pkeyutl -sign
,其中包含RSA密钥和-pkeyopt digest:name_of_digest
(重要!)也可以运行并回答您的问题真实的问题。