Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多种OpenSSL RSA签名方法产生不同的结果_Openssl_Rsa_Sign - Fatal编程技术网

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

多种OpenSSL RSA签名方法产生不同的结果,openssl,rsa,sign,Openssl,Rsa,Sign,试着让我的头脑集中在签名和使用/测试各种选项上 我可以使用以下命令进行签名: 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 ha

试着让我的头脑集中在签名和使用/测试各种选项上

我可以使用以下命令进行签名:

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);
复制:
密切相关:



交叉复制:

TLDR
dgst-sign
对于RSA,执行完整的RSASSA-PKCS1-v1_5:散列数据,在ASN.1中对散列进行编码,填充结果,然后使用modexp d
rsautl-sign
只执行最后两个,而
dgst
本身只执行第一个,因此跳过编码生成不同的非标准签名
dgst
(或您自己的散列),然后使用RSA密钥
pkeyutl-sign
-pkeyopt digest:name_of_digest
(重要!)
也可以工作并回答您真正的问题