你或許已經知道,區塊鏈上的交易大多都是透明公開的,使用者既可以直接通過RPC查詢NEO節點,也可以使用NEOTracker或NEOScan等方便好用的區塊鏈瀏覽器瀏覽交易記錄、餘額、智慧合約或區塊鏈上的其他資料。但是,開發某些應用時必須考慮到隱私性,通訊應用就是個典型的例子。如果你想給某人傳送一條資訊,你想必不希望其他人看到這條資訊,因為其中可能包含一些敏感內容。本文筆者將分享一些NEO區塊鏈資訊加密的基本知識。
首先讓我們再來研究一下NEO區塊鏈交易的剖析圖。
上圖顯示的是交易的基本記憶體結構。當使用者在鏈上傳送GAS或NEO時,錢包客戶端就會建立這個資料包並向全網廣播。如果你還想了解輕客戶端建立或交易基本結構的詳情,請參閱Andrei在Steemit上釋出的《如何建立NEO輕客戶端——區塊鏈開發者的入門“毒品”》。
關於資訊通訊,我們關注的只是緊隨輸入資料之後的後設資料,但NEO交易還有一個鮮為人知的功能,即使用者可以給任何交易附加交易屬性。交易屬性是一個廣義的概念,基本上指額外的資料資訊。所以使用者在傳送任意數量的NEO或GAS時都可以在交易屬性域中附加資訊。注:上述機制不適用於NEP-5代幣資產。
例如我可以給我的朋友傳送0.0000001個GAS並附上資訊“你好”。儘管我舉例說明的這則資訊看似無關緊要,但它卻能永久地儲存在區塊鏈上,且無法刪除。但正如我之前所說的,如果每個人都能看到這則資訊,那這則資訊也失去了意義。所以我們應該怎樣防止資訊洩漏呢?
回顧總結一下,我們希望實現以下目標:
上述操作理論上來說非常簡單,我可以建立一個金鑰來加密資訊,然後把金鑰告訴朋友,接著他(她)就能使用金鑰來解密資訊了。
但如果我想給10個甚至100個朋友傳送資訊呢?如果用建立金鑰的方法,我就需要為每個朋友建立一個金鑰,並追蹤所有金鑰,因為如果他們共用一個金鑰,那麼他們就能互相解密資訊了。此外,怎樣才能把我建立的金鑰安全地傳送給朋友呢?
回顧總結一下,在區塊鏈上傳送加密資訊需要完成以下步驟:
1. 生成金鑰
2 將金鑰告知朋友
3. 使用金鑰加密資訊
4. 將加密資訊附加在NEO交易的交易屬性域中併傳送
建立新錢包涉及四個關鍵要素:公鑰、私鑰、NEO地址和WIF。
通過WIF或私鑰可以推斷公鑰和NEO地址,但反之卻不可行。下面我們就來看下怎樣使用這些要素來生成密碼。
我繼續沿用密碼學的經典案例Alice和Bob的故事。Alice想給Bob傳送一條僅限他倆閱讀的資訊,想要實現這點,Alice和Bob之間就得有一個共享金鑰。相當於步驟1-2的操作。
首先,Alice和Bob擁有一對金鑰,
接著,Alice和Bob互換公鑰,
互換公鑰後便可使用一種稱為橢圓曲線金鑰交換體制(ECDH)(見維基百科)的常見技術建立雙方的“共享金鑰”。(https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman)
ECDH是一種匿名金鑰協商協議,金鑰對可基於此協議利用橢圓加密技術生成共享金鑰。
那麼現在加密所需的所有要素都交代完畢。
我不會演示共享金鑰生成過程涉及的所有演算法,請參考上方連結深入瞭解ECDH。
下方是我編寫的Go程式,演算結果如下(私鑰已移除)
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
結果顯示Alice和Bob的共享金鑰是完全一致的,故稱之為“共享金鑰”。
現在Alice和Bob可以使用衍生的共享金鑰和對稱金鑰演算法(見維基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm)(如高階加密標準,見維基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)來加密資訊了。
資訊已安全加密亟待傳送,這時我們將加密資訊插入到NEO交易的交易屬性域中,得到的結果如下。
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
在不解密的情況下,我們就無從得知Alice與Bob的對話內容,但如果沒有共享金鑰也就無法完成解密。
所幸Alice與Bob先前互換過公鑰,因此兩人對共享金鑰都有訪問許可權,因此他們可以使用共享金鑰來解密對方傳送的資訊。
這就是使用ECDH加/解密資訊的方法。
回顧總結一下,Alice與Bob互換了公鑰,因此可生成完全一致的共享金鑰。共享金鑰可用來加解密各自的資訊。上文僅是ECDH的基本介紹,下文將講解怎樣使用ECDH為NEO區塊鏈上的資訊加密。
Bob可以給Alice傳送0.00000001個GAS,並在交易屬性域0x02或0x03中附上他的公鑰。
鑑於Alice知道Bob的地址並且知道Bob給自己傳送了一筆交易,因此應用程式應該可以從交易屬性資料中獲取Bob的公鑰。
她的應用可以使用Bob的公鑰和Alice的私鑰生成一個共享金鑰,使用共享金鑰加密資訊,再將此加密資訊放入交易屬性域oxfo中,同時將Alice的公鑰放入oxo2中。
收到交易資訊後,Bob的應用可以抓取Alice附在交易屬性中的公鑰與加密資訊,接著開始解密。
閱讀NEO網路協議文件瞭解交易屬性域的用法。(http://docs.neo.org/en-us/node/network-protocol.html)
上述流程的示意圖如下。
當然,這篇文章並不能手把手教大家開發一個NEO區塊鏈實時通訊應用,但有助於大家瞭解安全通訊的概念。
資訊加密還有一個伴隨效應就是GAS的經濟效益,GAS的最小單位就是區塊鏈上傳送加密資訊所產生的費用。
希望通讀本文後你能對加密貨幣的加密技術有更深入的瞭解,如果你有任何問題,請隨時聯絡我,我的twitter賬號是@imapisit,郵箱是apisit@o3.network。
感謝Andrei對本文的審校與編輯。