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

今天就跟大家聊聊有关如何用Python实现区块链公私钥关系,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

成都创新互联公司长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为晋宁企业提供专业的成都做网站、成都网站制作、成都外贸网站建设晋宁网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。

1、私钥、公钥、地址之间的关系

私钥、公钥:椭圆曲线加密算法生成,但是无法通过公钥倒推得到私钥。公钥的作用是在和对方交易时,使用自己的私钥加密信息,然后对方使用自己的公钥解密获得原始信息,这个过程俗称签名。

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

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

2、公私钥加密流程

私钥签名过程:签名即是使用私钥将message加密,然后将原信息和加密后的信息发送出去的过程。

如何用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

签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305070131b

公钥验签

当矿工打包时,可以使用公钥进行验证签名。

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

签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305070131b

结果是:验证一致

私钥推导公钥

根据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实现区块链公私钥关系有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


本文名称:如何用Python实现区块链公私钥关系
网站路径:http://myzitong.com/article/jcejjo.html