我正在尝试编写一个验证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
为什么会出现这种情况?这个图书馆不是“官方的”吗?我有什么替代方案?删除该断言行是否安全?
您应该询问软件的作者:) –
尝试在r和s的值的开头插入一个零('0x00')字节(例如,将'81AABB ...'更改为0081AABB。 ..'),以确保数字被解释为正数(注意:这可能会很棘手,因为您可能需要调整编码签名中的长度 - 取决于如何将“r”和“s”值传递给ecdsa图书馆)。 – vlp