Python ecdsa签名密钥格式

Python ecdsa签名密钥格式,python,bitcoin,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.verifyi

我正在尝试使用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)。但我不确定SigningKey的字符串s应该是什么格式

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

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)
回溯(最近一次呼叫最后一次):
文件“address.py”,第23行,在
privateKeyToPublicKey(私钥)
privateKeyToPublicKey中第20行的文件“address.py”
sk=ecdsa.SigningKey.from_字符串(s,curve=ecdsa.SECP256k1)
文件“/usr/local/lib/python3.6/dist-packages/ecdsa/keys.py”,第行
149,从_字符串输入
assert len(string)=curve.baselen,(len(string),curve.baselen)
断言错误:(64,32)

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

private_key.decode('hex')
或者你可以使用

binascii.unhexlify

在python3中,这里有一个更完整的代码示例,以明确答案。蟒蛇3

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()) 从ecdsa导入签名密钥,SECP256k1 导入sha3、随机、binascii 私钥=“”.join(['%x'%random.randrange(16)表示范围(0,64)中的x)]) 私钥=字节(私钥“utf-8”) 私钥=binascii.unhexlify(私钥) priv=签名密钥。从字符串(私钥,曲线=SECP256k1) pub=priv.get\u验证\u key()到\u string() keccak=sha3.keccak_256() keccak.update(发布) address=keccak.hexdigest()[24:] 打印(地址,priv.to_string().hex())