不懂程式,也能理解的區塊鏈錢包技術原理(二)創建地址&數位簽章

私鑰、公鑰與助記詞是怎麼生成的?訊息又是如何傳遞的呢?本篇將介紹其運作原理。

Eric Liou
7 min readDec 4, 2019

你好!新手上路,有錯還請指正。

Photo by Edoardo Tommasini from Pexels

上一篇開場談到了錢包軟體的角色與功能,本篇將開始談其背後的技術,將分成兩篇,此篇先說明❶ ❷ 功能。

創建私鑰、地址
傳遞訊息

這邊就先略過了兩個功能的需求與目的,直接介紹其背後的技術原理。當然,你也可以回上一篇看一下,幫助後續的理解。

創建私鑰、地址

創建流程

以創建地址的角度來說,整體是一個流程,過程中會有三個產物:私鑰、公鑰與地址。

本人手工製,引用請註明出處。

[1]透過密碼學SHA-256算法隨機生成一個隨機數,把它用來當作密碼,稱作私鑰 Private Key
[2]將私鑰,透過橢圓曲線密碼學對應生成公鑰 Public Key
[3]再將公鑰,進行SHA-256散列等編碼得到地址 Address

生成的流程是單向運算的,是不可逆的,公鑰無法反推出私鑰,地址無法反推出公鑰。這樣的特性,讓錢包軟體所生成的公鑰與地址,可以在區塊鏈上公開使用,即使任何人取得某個公鑰或是地址,也無法推算出其私鑰。

你可能早已知道私鑰與地址的作用,那公鑰是幹嘛的呢?後面會提到 😜

視覺化地址生成器
http://royalforkblog.github.io/2014/08/11/graphical-address-generator/

地址生成方式會有不同

從區塊鏈的角度來看,不同的區塊鏈或是同一個區塊鏈,都會有地址協議的不同的狀況,於是錢包軟體就需要針對性的設計,不同的地址生成方式。

  • 不同的區塊鏈,例如:比特幣與以太坊,兩者的地址協議是不同的,
比特幣地址:1Bn3YxHMpQod86v1kUKQDtgzqJSoWqNpax
以太坊地址:0x9f8b6c492cb8e97c77fbdb6cb2e31d6c808148a2
  • 若某區塊鏈進行節點軟體更新時,新版有著不同於舊版的地址協議,並且新舊版本互相兼容(新版本向後兼容/軟分叉),就會造成同一個主鏈有著不同的地址協議。
比特幣有三種地址協議
Legacy(1開頭):1Bn3YxHMpQod86v1kUKQDtgzqJSoWqNpax
Nested SegWit(3開頭):3FnuwRTns9VMBD3JQwVJyGRLEosGKY8tqn
Native SegWit(bc1開頭):bc1qlaf8k2xqj64dxszgzmh8x7uqzawe0x5va6ykvl

對於錢包軟體而言,一個私鑰只會生成一個公鑰,至於公鑰生成地址時,是可以用同一個公鑰,對應不同地址協議,而生成不同地址的。

傳遞訊息

要了解錢包軟體與區塊鏈的訊息溝通方面,需要先知道區塊鏈的運作方式。

開放的點對點網絡

區塊鏈是一個開放的資訊交換網路體系(P2P Network),任何參與者都可以發出交易訊息,也可以自由承接鏈上的任何交易需求,進行處理,也因為開放的網路環境之下,需要可靠且安全的驗證訊息機制。

  1. 密碼雜湊函數:確保收到的交易訊息是正確或完整的。
  2. 數位簽章:確保交易訊息非假冒身份者所發出的。
假冒身份
惡意者佯裝成A地址的所有者,發出交易訊息,要求將A地址的加密貨幣轉入自己的地址中。

密碼雜湊函數 Cryptographic Hash Function

訊息透過運算函數計算出一組字串,而這組字串可用於驗證訊息是否有被修改過,或是訊息是不完整的。

我先說明驗證流程,假設A端要傳一封訊息給B端:

本人手工製,引用請註明出處。

❶ A端將訊息Message,透過雜湊函數運Hash( )運算出訊息摘要Message Digest。
❷ A端將訊息與訊息摘要一同傳送給B端。
❸ B端拿到訊息後,將訊息透過雜湊函數運算出訊息摘要。
❹ B端比對收到訊息摘要跟自己運算出來的,是否是一樣的。

雜湊函數算出來的訊息摘要,具有一個特性,不管來源訊息有多小的更動,只要有更動,就會運算出不一樣訊息摘要,請見以下範例:

原來的訊息:王小明轉100元謝小美
訊息摘要:3009980c55ae9a33b175612866c0a7b0bfe01298aeea0ca4631bf3007d38caac
將王與小之間,增加空格。修改後的訊息:王 小明轉100元謝小美
訊息摘要:6203d40e264b1d24a4b03c0f5e6c26e0dbdbf4692d8bfea5b2de6411f6fcd24b

所以利用比對訊息摘要,就可以辨識收到的訊息,是否在傳輸層Transport Layer中有被修改過,或是有不完整的情形,但它也僅為這樣作用而已,它無法確認訊息來源是否為假冒身份者,例如:謝小美可以發出 「王小明轉100元謝小美」交易訊息,並附上可成功比對的訊息摘要。

數位簽章 Digital Signature

來源端在傳遞訊息時,一並提供自己的數位簽章,讓接收端透數位簽章確認,訊息是來源端所授權的,並非假冒身份者。

對應前述的驗證流程,其實就是在傳輸層中,利用數位簽章替代訊息摘要,如下:

本人手工製,引用請註明出處。

❶ A端先將自己的公鑰Public Key提供給B端。
❷ A端將運算出的訊息摘要,透過自己的私鑰Private Key,執行簽章運算Sign( ),產生了數位簽章Signature。
❸ A端將訊息與數位簽章一同傳送給B端。(上圖省略了訊息的傳輸示意)
❹ B端利用收到的數位簽章與A端公鑰,解密出訊息摘要。

透過A端私鑰所運算出的數位簽章,只有A端公鑰能解開,反面來說,A端公鑰是解不開其他人的數位簽章,所以B端就能確保簽章來源是A端所發出的,非假冒身份者。當然,最後一個解密運算步驟,是算不出A端私鑰的,可以保全A端不會外流私鑰。

整合上述兩個流程

簡化來說,A端發出訊息與自己的公鑰,並附上自己的數位簽章(私鑰加密),B端接受後,用A端公鑰解密數位簽章,若解開了代表訊息是A端所授權的,非假冒身份者,然後再驗證訊息摘要,若是一樣,就可以確保訊息是正確且完整的。

回歸到錢包軟體的部分,假設A端是錢包軟體,就必須有執行雜湊函數Hash Function與數位簽章Digital Signature的能力囉!

本文較長,但希望有帶你深入淺出的效果。
感謝閱讀,有任何問題,歡迎指教!

下一篇,會談錢包軟體的管理私鑰功能,其需求目的與解決方案。

不懂程式,也能理解的區塊鏈錢包技術原理(三)HD Wallet

拍手(claps)按鈕示範

如果喜歡這篇文章,可以透過拍手👏給我鼓勵一下。
*拍手按鈕可以點擊 1–50 次
*長按按鈕會自動增加次數。

歡迎至下方拍手鼓勵,謝謝大家 😄

--

--

Eric Liou

深深著迷於區塊鏈的思維,以相對白話,但不失完整性的方式,讓大家認識區塊鏈。