溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系

發(fā)布時間:2021-12-17 17:14:56 來源:億速云 閱讀:315 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

1、私鑰、公鑰、地址之間的關(guān)系

私鑰、公鑰:橢圓曲線加密算法生成,但是無法通過公鑰倒推得到私鑰。公鑰的作用是在和對方交易時,使用自己的私鑰加密信息,然后對方使用自己的公鑰解密獲得原始信息,這個過程俗稱簽名。

地址:由于公鑰太長,在交易中不方便使用,就對公鑰哈希進(jìn)行SHA256、RIPEMD160、Base58算法加密生成地址。


如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系


2、公私鑰加密流程

私鑰簽名過程:簽名即是使用私鑰將message加密,然后將原信息和加密后的信息發(fā)送出去的過程。

如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系


公鑰驗簽過程:收到對方發(fā)送的信息和私鑰簽名后的信息,使用對方的公鑰機(jī)密簽名后的信息,并和原信息進(jìn)行比對,一致則未篡改,反之。

如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系


3、Python實現(xiàn)(以太坊)

生成公私鑰

以太坊可以基于密碼生成公私鑰。

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
 

生成的結(jié)果:

密鑰是:123

私鑰是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

公鑰是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2

私鑰簽名

當(dāng)有一筆交易時,可以使用私鑰針對交易簽名,所以私鑰要保存好。

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 '私鑰格式不對'
 

結(jié)果是:

原文是:qwe

私鑰是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

簽名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305070131b

公鑰驗簽

當(dāng)?shù)V工打包時,可以使用公鑰進(jìn)行驗證簽名。

def verifity(text, signature, address):
   """
   驗證簽名
   :param text: 原文本
   :param signature: 簽名
   :param address: 公鑰
   :return: 驗證結(jié)果
   """
   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

結(jié)果是:驗證一致

私鑰推導(dǎo)公鑰

根據(jù)1中的關(guān)系私鑰是可以推出公鑰。

def recover_address(prv_key):
   """
   基于私鑰推出地址
   :param prv_key: 私鑰
   :return: 地址
   """
   try:
       acct = Account.from_key(prv_key)
       return acct.address
   except:
       return '格式錯誤'
 

結(jié)果是:

私鑰是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

結(jié)果是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2

看完上述內(nèi)容,你們對如何用Python實現(xiàn)區(qū)塊鏈公私鑰關(guān)系有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI