你或許已經知道,區塊鏈上的交易大多都是透明公開的,用戶既能夠直接經過RPC查詢NEO節點,也可使用NEOTracker或NEOScan等方便好用的區塊鏈瀏覽器瀏覽交易記錄、餘額、智能合約或區塊鏈上的其餘數據。可是,開發某些應用時必須考慮到隱私性,通信應用就是個典型的例子。若是你想給某人發送一條信息,你想必不但願其餘人看到這條信息,由於其中可能包含一些敏感內容。本文筆者將分享一些NEO區塊鏈信息加密的基本知識。html
首先讓咱們再來研究一下NEO區塊鏈交易的剖析圖。node
NEO交易算法
上圖顯示的是交易的基本內存結構。當用戶在鏈上發送GAS或NEO時,錢包客戶端就會建立這個數據包並向全網廣播。若是你還想了解輕客戶端建立或交易基本結構的詳情,請參閱Andrei在Steemit上發佈的《如何建立NEO輕客戶端——區塊鏈開發者的入門「毒品」》。api
關於信息通信,咱們關注的只是緊隨輸入數據以後的元數據,但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互換公鑰,
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對本文的審校與編輯。
原文出處:https://medium.com/proof-of-working/encrypted-messaging-on-the-neo-blockchain-631bbfcf99f6
歡迎進技術羣交流:795681763