2012-01-05 49 views
2

我有一個消息用.Net RSACryptoServiceProvider簽名,然後將消息發送到 Python軟件,它試圖用m2crypto(基於openssl的lib)驗證符號。RSACryptoServiceProvider消息簽名驗證與m2crypto

我已經得到了公共證書,這是用於簽名消息的私鑰對。

.NET軟件發送之前唱使用ByteArrayToString,因爲是用下面的代碼生成的符號轉換:

//Convert plain text into a byte array to sign. 
    byte[] data = new UTF8Encoding().GetBytes(phrase); 
    SHA1Managed sha1 = new SHA1Managed(); 
    byte[] hashBytes = sha1.ComputeHash(data); 

    byte[] sig = csp.SignData(hashBytes, CryptoConfig.MapNameToOID("SHA1")); 

所以sended到接收器的簽名是

ByteArrayToString(sig) 

的Python部分是:

def verify(message, signature, cert_path): 
     msg = hashlib.sha1(message).hexdigest() 
     certificate = M2Crypto.X509.load_cert(cert_path) 
     pubkey = certificate.get_pubkey() 
     pubkey.reset_context(md='sha1') 
     pubkey.verify_init() 
     pubkey.verify_update(msg) 
     sgn = signature.decode('base64') 
     is_verified = pubkey.verify_final(sgn) 

而且我無法獲得驗證離子...我認爲Python部分中的簽名編碼可能存在問題,但也許有人可以看到其他任何錯誤?

當我用我自己的證書(OpenSSL的生成),並簽署從Python本身的消息,編碼簽名,發送,然後解碼和驗證一切正常......

我將不勝感激任何註釋!

回答

0

我不能保證我的答案,因爲我從來沒有使用m2crypto,但我認爲該消息被哈希兩次。在

sha1.ComputeHash(數據)

csp.SignData(HASHBYTES,CryptoConfig.MapNameToOID( 「SHA1」))

MSDN documentationSignData指定:

使用 指定的散列算法計算指定字節數組的散列值,並簽署結果散列值。

因此我不認爲你應該在生成簽名之前預先哈希消息。

+0

謝謝Jcs - 我剛剛找到了你的答案。我的客戶向我提供了兩次消息......但他的IT部門忘了告訴我這件事.. – sebzur 2016-01-19 09:41:21