ecdsa 签名密钥格式

ecdsa signing key format

我正在尝试使用 python 创建一个 public/private 密钥对。

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

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

使用这个私钥,我尝试使用 ecdsa 图生成相应的 public 密钥

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

由于字符串格式错误的格式错误,我无法创建签名密钥 (sk)。但是我不确定 how/what 字符串 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)

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

private_key.decode('hex')

或者您可以使用

binascii.unhexlify

在python3

这里有一个更完整的代码示例,可以清楚地说明答案。 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())