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,以檢查潛在的排序問題,但這並沒有幫助。
我在做什麼錯?