M2Crypto:验证DSA签名

时间:2010-08-11 00:41:33

标签: python digital-signature m2crypto dsa

我无法使用Python / M2Crypto验证DSA签名。签名使用标准的java.security.Signature类,使用Sun的加密提供程序和SHA1withDSA算法标识在Java中生成。

这是一些shell输出:

>>> 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

签名值对我来说似乎没问题,它看起来像是两个整数的正确ASN.1编码序列(0x302c指定一个44字节的序列,0x0214指定一个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,检查潜在的字符串问题,但这没有帮助。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

在测试中找到了解决方案:http://svn.osafoundation.org/m2crypto/trunk/tests/test_dsa.py

verify_asn1方法应按如下方式使用:

>>> pk.verify_asn1(sha1(data).digest(), sig)