2010-08-11 54 views
2

我在使用Python/M2Crypto驗證DSA簽名時遇到了問題。簽名是使用標準的java.security.Signature類和Sun的加密提供程序以及SHA1withDSA算法標識在Java中生成的。M2Crypto:驗證DSA簽名

下面是一些貝殼輸出:

>>> pk 
<M2Crypto.DSA.DSA_pub instance at 0x20b6a28> 
>>> sig = '302c02141c4bbb218215ebfec57288059ce814dc430d849502144dd0c581bf2213aff79d17eb37c939e120a97bd2'.decode('hex') 
>>> data ='0501...9794'.decode('hex') 
>>> pk.verify_asn1(sig, data) 
------------------------------------------------------------ 
Traceback (most recent call last): 
    ... 
DSAError: wrong tag 

簽名值似乎確定以我來說,它看起來像兩個整數(0x302c指定一個44字節的序列,和0x0214指定的一個正確的ASN.1編碼序列20字節整數),這是DSA簽名的標準編碼。

由於DSA_pub.verify_asn1方法甚至沒有記載,我也嘗試過使用記錄DSA_pub.verify方法,但仍沒有雪茄:

>>> r = sig[4:24] 
>>> s = sig[26:] 
>>> md = sha1(data).digest() 
>>> pk.verify(md, r, s) 
------------------------------------------------------------ 
Traceback (most recent call last): 
    ... 
DSAError: encoding error 

該文檔的狀態,所有的參數應該是「字節字符串「,但驗證方法以某種方式設法導致編碼錯誤。 我也嘗試了反轉r和s,以檢查潛在的排序問題,但這並沒有幫助。

我在做什麼錯?

回答