2016-08-04 47 views
1

试图绕过签名并使用/测试各种选项。多个OpenSSL RSA签名方法产生不同的结果

我可以注册使用这个命令:

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); 

回答

1

杜佩: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

TLDRdgst -sign为RSA确实充分RSASSA-PKCS1-v1_5中:散列数据,在ASN.1中对散列进行编码,填充结果和modexp d。 rsautl -sign本身只有最后两个和dgst只有第一个,因此跳过编码产生不同的和非标准的签名。 dgst(或你自己的散列)然后pkeyutl -sign与一个RSA密钥-pkeyopt digest:name_of_digest(重要!)也工作和回答你真正的问题。

相关问题