2010-08-11 52 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,以检查潜在的排序问题,但这并没有帮助。

我在做什么错?

回答