主页 > 下载imtoken钱包20app > 如何用Python实现区块链公私钥关系

如何用Python实现区块链公私钥关系

下载imtoken钱包20app 2023-06-08 06:53:11

今天就和大家聊聊如何用Python实现区块链的公私钥关系。 很多人可能不太了解。 为了让大家更好的了解,小编为大家总结了以下内容。 我希望你能在这篇文章的基础上学到一些东西。 报酬。

1. 私钥、公钥和地址的关系

私钥、公钥:椭圆曲线加密算法生成私钥,但不能从公钥推导出私钥。 公钥的作用是在与对方进行交易时,用自己的私钥对信息进行加密,然后对方用自己的公钥解密得到原始信息。 此过程通常称为签名。

地址:由于公钥太长,不方便在交易中使用,所以对公钥的哈希值进行SHA256、RIPEMD160、Base58算法加密生成地址。

如何用Python实现区块链公私钥关系

2.公私钥加密过程

私钥签名过程:签名是用私钥加密消息,然后发送原始消息和加密消息的过程。

以太坊官网以太坊_以太坊地址与私钥的关系_以太坊私钥未加密

如何用Python实现区块链公私钥关系

公钥签名验证过程:接收对方发送的信息和私钥签名的信息,使用对方公钥秘钥签名的信息,与原始信息进行比对,一致则为未被篡改,反之亦然。

如何用Python实现区块链公私钥关系

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实现区块链的公私钥关系有了更进一步的了解呢? 如果您想了解更多知识或相关内容以太坊地址与私钥的关系,请关注易速云行业资讯频道,感谢您的支持。