ecdsa签名密钥格式

时间:2018-11-11 21:35:17

标签: python bitcoin

我正在尝试使用python创建一个公钥/私钥对。

我使用以下方法创建了私钥:

private_key = ''.join(['%x' % random.randrange(16) for x in range(0, 64)])

我尝试使用此私钥来使用ecdsa图生成对应的公钥

def privateKeyToPublicKey(s):
    sk = ecdsa.SigningKey.from_string(s, curve=ecdsa.SECP256k1)
    vk = sk.verifying_key
    return ('\04' + sk.verifying_key.to_string())

由于格式错误(我的字符串格式错误),我无法创建签名密钥(sk)。但是我不确定字符串s应该如何/以何种格式工作以使SigningKey起作用。

运行脚本时出现以下错误:

Traceback (most recent call last):
  File "address.py", line 23, in <module>
    privateKeyToPublicKey(private_key)
  File "address.py", line 20, in privateKeyToPublicKey
    sk = ecdsa.SigningKey.from_string(s, curve=ecdsa.SECP256k1)
  File "/usr/local/lib/python3.6/dist-packages/ecdsa/keys.py", line 
149, in from_string
    assert len(string) == curve.baselen, (len(string), curve.baselen)
AssertionError: (64, 32)

2 个答案:

答案 0 :(得分:1)

这里是一个更完整的代码示例,以明确答案。 Python3。

    from ecdsa import SigningKey, SECP256k1
    import sha3, random, binascii

    private_key = ''.join(['%x' % random.randrange(16) for x in range(0, 64)])
    private_key = bytes(private_key, 'utf-8')
    private_key = binascii.unhexlify(private_key)
    priv = SigningKey.from_string(private_key, curve=SECP256k1)
    pub = priv.get_verifying_key().to_string()
    keccak = sha3.keccak_256()
    keccak.update(pub)
    address = keccak.hexdigest()[24:]
    print(address, priv.to_string().hex())

答案 1 :(得分:0)

我已经意识到我的错误,输入必须以字节为单位,私钥为十六进制格式。在python2中,您可以使用:

private_key.decode('hex')

或者您可以使用

binascii.unhexlify

在python3中