我正在尝试使用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)
答案 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中