主页 > 下载imtoken钱包20app > 如何用Python实现区块链公私钥关系
如何用Python实现区块链公私钥关系
今天就和大家聊聊如何用Python实现区块链的公私钥关系。 很多人可能不太了解。 为了让大家更好的了解,小编为大家总结了以下内容。 我希望你能在这篇文章的基础上学到一些东西。 报酬。
1. 私钥、公钥和地址的关系
私钥、公钥:椭圆曲线加密算法生成私钥,但不能从公钥推导出私钥。 公钥的作用是在与对方进行交易时,用自己的私钥对信息进行加密,然后对方用自己的公钥解密得到原始信息。 此过程通常称为签名。
地址:由于公钥太长,不方便在交易中使用,所以对公钥的哈希值进行SHA256、RIPEMD160、Base58算法加密生成地址。
2.公私钥加密过程
私钥签名过程:签名是用私钥加密消息,然后发送原始消息和加密消息的过程。
公钥签名验证过程:接收对方发送的信息和私钥签名的信息,使用对方公钥秘钥签名的信息,与原始信息进行比对,一致则为未被篡改,反之亦然。
3. Python实现(以太坊)
生成公钥和私钥
以太坊可以根据密码生成公钥和私钥。
from eth_account import Account
from eth_utils.hexadecimal import encode_hex
from eth_account.messages import encode_defunct
import json
def get_key(key):
"""
获取公钥私钥
:return: 返回公钥、私钥
"""
ac1 = Account.create(key)
return encode_hex(ac1.key),ac1.address
生成结果:
关键是:123
私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246
公钥是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2
私钥签名
当有交易时以太坊地址与私钥的关系,可以使用私钥对交易进行签名,因此私钥要妥善保管。
def message_sign(text, prv_key):
"""
基于私钥获取签名
:param text: 待签名的文本
:param prv_key: 私钥
:return: 签名
"""
try:
message = encode_defunct(text=text)
result = Account.sign_message(message, prv_key)
result = str(result)
result = result[result.find("'signature':"):result.find(')})')]
return result[result.find("('") + 2:].replace("'", '')
except:
return '私钥格式不对'
结果是:
原文为:qwe
私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246
签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305b07
公钥签名
矿工打包时,可以使用公钥来验证签名。
def verifity(text, signature, address):
"""
验证签名
:param text: 原文本
:param signature: 签名
:param address: 公钥
:return: 验证结果
"""
try:
message = encode_defunct(text=text)
address_new = Account.recover_message(message, signature=signature)
if address == address_new:
return '验证一致'
else:
return '验证失败'
except:
return '格式错误'
原文为:qwe
公钥是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2
签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305b07
结果为:验证一致
从私钥推导公钥
根据1中的私钥关系,可以推导出公钥。
def recover_address(prv_key):
"""
基于私钥推出地址
:param prv_key: 私钥
:return: 地址
"""
try:
acct = Account.from_key(prv_key)
return acct.address
except:
return '格式错误'
结果是:
私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246
结果是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2
看完以上内容,是不是对如何使用Python实现区块链的公私钥关系有了更进一步的了解呢? 如果您想了解更多知识或相关内容以太坊地址与私钥的关系,请关注易速云行业资讯频道,感谢您的支持。