Python edcsa SECP256k1 未正确签名

Posted

技术标签:

【中文标题】Python edcsa SECP256k1 未正确签名【英文标题】:Python edcsa SECP256k1 is not signing correctly 【发布时间】:2018-05-04 13:42:32 【问题描述】:

我使用https://github.com/warner/python-ecdsa 库来创建私钥和公钥。

我生成了那个键

private key = 'ffbd2d76fde8d62642379e507f4ab69883e094708410392d8470246146195e56'
public key = '04' + '615a523e41d5984d5afc18e5adddddfa0ab8ac63b49933ff1b07fae90604fa6cdd6572996117b3ffce6e1258668c88fc2aad3c45eab31ef8a57b5176c91b272a'

签名数据

message = 'aaa'
signHex = privateKey.sign(message,hashfunc=hashlib.sha256).encode("hex")
# signHex : afe2f94df735d1d0c571c9c10dbd3e9271ad1dd4e6c5d523901324c01a4de25e5b9825f8de3fffeebd477f575c83997998df32e8b0a7053b5a43813f269bd4ee

当我在 js 在线工具中使用我的钥匙检查标志时,它说您的标志无效。我还用相同的键生成了符号,并在这个工具中检查了 java 符号,它说它是有效的符号。为什么在线工具说 python ecdsa 标志的标志无效。 python for sign有什么问题?

在线工具:https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html

【问题讨论】:

【参考方案1】:

我解决了问题。我添加了 sigencode=sigencode_der 参数,它工作正常。

正确的符号代码:

from ecdsa import SigningKey, VerifyingKey, SECP256k1
from ecdsa.util import sigencode_der

message = 'aaa'
signHex = privateKey.sign(message,hashfunc=hashlib.sha256,sigencode=sigencode_der).encode("hex")
# signHex = 3044022072ae5b5cf026796ee8217df26eb70f3dd72016f87af0a5fd8d6a99faf51e77f802206a77d3a3acc9540721f34e776b8feb7e2ea69e321d25872d3d65b7fd15c8132d

【讨论】:

以上是关于Python edcsa SECP256k1 未正确签名的主要内容,如果未能解决你的问题,请参考以下文章

Secp256k1 库

如何从 32 字节原始私钥中获取 java.security.PrivateKey ? (Secp256k1 算法)

Secp256k1 曲线签名接近预期签名但缺少 2 段

libsecp256k1比特币密码算法开源库

Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥

Spartan-ECDSA:最快的浏览器内 ZK secp256k1 ECDSA