2016-08-04 85 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(重要!)也工作和回答你真正的問題。