如何在NEO区块链上实现信息加密

你或许已经知道,区块链上的交易大多都是透明公开的,用户既能够直接经过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对本文的审校与编辑。

相关文章
相关标签/搜索