2017-07-26 76 views
1

我正在將服務從Python 2.7遷移到使用RSA加密/解密與另一服務進行通信的Python 3.5。RSA簽名不同於rsa模塊和m2crypto生成


的Python(V2.7)m2crypto(0.25.1)<正確的簽名>

key = M2Crypto.RSA.load_key(private_key) 
digest = hashlib.sha1(bytes(cipher_text, encoding="UTF-8")).hexdigest() 
signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding)) 

的Python(V3.5)RSA(v3.4.2)

pri_key = rsa.PrivateKey.load_pkcs1(private_key) 
signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1")) 

以上代碼產生的簽名是不同的。這些軟件包有什麼區別?

回答

0

您正在執行不同的加密操作。 加密與私鑰!=數字簽名

signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding)) 

signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1")) 

與PCKS#1 V1.5的數字簽名,使上摘要算法標識符和所述消息的編碼的摘要的RSA加密在ASN.1

signature = 
    RSA_Encryption( 
     ASN.1(DigestAlgorithmIdentifier + SHA1(message))) 

雖然加密不包括摘要算法標識符

似乎Python的key.private_encrypt是OpenSSL的RSA_private_encrypt包裝看一看,以警告有關pkcs1_padding您使用

RSA_PKCS1_PADDING

PKCS#1 v1.5的填充。此功能不處理在PKCS#1中指定的algorithmIdentifier。在生成或驗證PKCS#1簽名時,應使用RSA_sign(3)RSA_verify(3)

對於數字簽名,您應該使用sign而不是private_encrypt。但是,如果您想要加密來隱藏郵件的內容,則應該使用公鑰加密,而不是私鑰。

+0

但是如果第二個服務接受從m2crypto代碼生成的簽名會怎麼樣?在那種情況下我應該怎麼做? – infiQuanta

+0

如果你擁有這項服務,我建議你相應地修改它。如果這是不可能的,我想你別無選擇,只能繼續使用'private_encrypt' – pedrofb

+1

替代選項是幫助我完成https://gitlab.com/m2crypto/m2crypto/merge_requests/65並且您不必移植出M2Crypto;)。不過,我現在正在爲OpenSSL 1.1.0提供支持,因此預計該分支機構的主要重組。 – mcepl