你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过 RPC 查询 NEO 节点,也可以使用 NEOTracker 或 NEOScan 等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些 NEO 区块链信息加密的基本知识。
首先让我们再来研究一下 NEO 区块链交易的剖析图。
NEO 交易
上图显示的是交易的基本内存结构。当用户在链上发送 GAS 或 NEO 时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅 Andrei 在 Steemit 上发布的《如何创建 NEO 轻客户端——区块链开发者的入门“毒品”》。
关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但 NEO 交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的 NEO 或 GAS 时都可以在交易属性域中附加信息。注:上述机制不适用于 NEP- 5 代币资产。
例如我可以给我的朋友发送 0.0000001 个 GAS 并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
回顾总结一下,我们希望实现以下目标:
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
但如果我想给 10 个甚至 100 个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:
生成密钥
将密钥告知朋友
使用密钥加密信息
将加密信息附加在 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…)
ECDH 是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
那么现在加密所需的所有要素都交代完毕。
使用公钥和私钥生成共享密钥
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解 ECDH。
下方是我编写的 Go 程序,演算结果如下(私钥已移除)
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPWAlice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2daBob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
结果显示 Alice 和 Bob 的共享密钥是完全一致的,故称之为“共享密钥”。
现在 Alice 和 Bob 可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki…)(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki…)来加密信息了。
使用共享密钥加密信息
信息已安全加密亟待发送,这时我们将加密信息插入到 NEO 交易的交易属性域中,得到的结果如下。
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to BobBob 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/nod…)
上述流程的示意图如下。
当然,这篇文章并不能手把手教大家开发一个 NEO 区块链实时通讯应用,但有助于大家了解安全通讯的概念。
信息加密还有一个伴随效应就是 GAS 的经济效益,GAS 的最小单位就是区块链上发送加密信息所产生的费用。
希望通读本文后你能对加密货币的加密技术有更深入的了解,如果你有任何问题,请随时联系我,我的 twitter 账号是 @imapisit,邮箱是 apisit@o3.network。
感谢 Andrei 对本文的审校与编辑。
原文出处:https://medium.com/proof-of-w…