2016-01-10 68 views
0

我正在尝试编写一个验证ECDSA签名的python脚本,并且我正在尝试这么做的可怕时间。为什么python ECDSA不支持负数?

这是我使用的代码:

public_key = ecdsa.VerifyingKey.from_string(pubkey, curve=ecdsa.SECP256k1) 
verified = public_key.verify_digest(signature, val, sigdecode=ecdsa.util.sigdecode_der) 

如果签名[R小号是积极的,它工作得很好,但如果其中一方为负,断言错误引发。我检查了ECDSA源代码,我看到这一行:

nbytes = numberbytes[0] if isinstance(numberbytes[0], integer_types) else ord(numberbytes[0]) 
assert nbytes < 0x80 # can't support negative numbers yet 

https://github.com/warner/python-ecdsa/blob/master/ecdsa/der.py#L105

为什么会出现这种情况?这个图书馆不是“官方的”吗?我有什么替代方案?删除该断言行是否安全?

+0

您应该询问软件的作者:) –

+1

尝试在r和s的值的开头插入一个零('0x00')字节(例如,将'81AABB ...'更改为0081AABB。 ..'),以确保数字被解释为正数(注意:这可能会很棘手,因为您可能需要调整编码签名中的长度 - 取决于如何将“r”和“s”值传递给ecdsa图书馆)。 – vlp

回答

2

ECDSA本身不使用负数,所以我不希望它的Python实现支持负数。 ECDSA使用的数字类型在0和一些大的素数之间,他们服从模运算法则。

+0

那么为什么我的openssl最终会返回负数或负数? – Jorky10

+1

@ Jorky10 - 这取决于标准。如果它们编码为ASN.1 ***'INTEGER' ***,那么它们将永远不会成为负数,因为会有一个前导00字节。如果它们是ASN.1 ***'OCTET_STRING' ***或一个字节字符串(即,当使用SHA1时,***'{r,s}'***对有40个字节时,64个字节用于**当使用SHA256等时,会出现'{r,s}'***对),那么Python在其解析器或子例程中存在一个错误。 – jww

+0

我想这就是诀窍。谢谢你给我一条路! – Jorky10