Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
270 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
9 s) Y& e7 a6 O9 ?( R  Y
; q2 `: T1 p4 h) g: K首先让我们再来研究一下NEO区块链交易的剖析图。
3 p+ O$ H* Q4 G
( R8 N) m* S4 d. Q4 VNEO交易, F7 t5 p* A# U# V
4 I; N, K+ V; p, ^8 ~4 o3 N9 g
上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。0 j# Q6 y1 ~. z# ?

9 x! G/ S2 x+ K! n$ h1 `关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。* ^2 ~- |$ v/ D% d( N8 k3 J# H. r3 a
+ M" p8 ^; q; u- Z
例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
. ?$ C3 o! S- ?7 [8 y+ O8 g; b  ]" k
回顾总结一下,我们希望实现以下目标:
( g6 ~6 I4 v; o9 c% E9 p$ \/ A, x: q9 f) D
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
5 q7 C. r+ e0 H# t
. a$ b: ~: z: X3 ^7 U. c但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?: B" {* j2 @! m3 o( G5 `! l

: }( k+ P2 Q: ?3 R回顾总结一下,在区块链上发送加密信息需要完成以下步骤:5 |+ ~9 F5 I7 [+ k0 b  f- H

$ M1 e$ r6 `8 s1 r/ j4 C* ?生成密钥
1 \  S& ~  k* L3 Q3 d7 L4 o
2 I% l$ M* }( m6 F! O2 将密钥告知朋友
% ^5 W+ g3 ~; {+ E
0 b6 q8 B3 U; m" E6 F& G3 M+ A使用密钥加密信息' M& v- M9 v' s

; _8 v; ?5 w  u2 `% l- u1 I4 ]将加密信息附加在NEO交易的交易属性域中并发送
+ z) b0 ^1 B  d- Y# q9 d+ L1 D) J+ j" [$ M9 M$ K
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。
6 S. ~/ l9 L: E" o. D
  H5 g* }( w) d3 ?. e* m5 F通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
7 D6 Y# i* q# t$ J
7 {" I8 c- O: C9 E) G* Z7 A我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。
" U" @9 O' g) b1 L  ~7 i' {- c9 X: c- H& u' E6 R6 b
首先,Alice和Bob拥有一对密钥,
" M3 b4 g- a" }$ d( D$ a. }* O: ^. a1 M; a9 P& n% H+ N& [
接着,Alice和Bob互换公钥,/ R: s! Q* f0 z! T8 X  k

, D$ Z7 F6 o5 a+ cAlice与Bob互换公钥1 U8 _3 t4 h" N- f8 q

+ I5 A$ `3 a. k, Y# T互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman# G. E: g, x2 g" O( ~
& j9 O7 G- Q; r( ^0 t- ~
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。+ y+ T8 c* h/ w* P; L: z
. \9 @7 \) y5 V5 P" x8 m
那么现在加密所需的所有要素都交代完毕。6 `8 [4 {% n4 ]6 A3 k$ j) H3 c) A

0 F& B1 f  D. \" R使用公钥和私钥生成共享密钥0 L; S% P+ e+ U( u4 C

- h( r; j) S! X1 x7 P& R. v0 v我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
- d& A" J  c" _4 k' _) Q5 e8 O5 H, W
下方是我编写的Go程序,演算结果如下(私钥已移除)
% u4 w% b% n, R( d" N6 V$ [! ]' l" V3 a$ P  X
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
: K  e' ~9 v+ a* K4 \& W! B2 c2 \, n. n7 R3 q
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
3 [/ P) m4 U# C; K
' R0 d. y/ g2 _9 R" ?$ L4 B; tAlice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
3 Q. h8 ~3 O: O$ d, \8 O* R- c+ N2 s
+ f* c" Q( ?1 ^Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557: g6 H6 b& p8 }8 w' g
- b( q0 t3 s- w( V) _0 q
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
. t, R) N4 j5 J% L
$ h- g9 w$ r5 @& M% `( ~; {Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5; u' F1 g0 g: V  i1 u6 n/ a# D$ ^% n
1 O; m+ |1 V; j9 l5 `9 `# N" c# A" h
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。9 H# [$ M( Z5 K

4 z* w: F# j$ H现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
* M$ d$ X: o/ T7 ]: b- V+ D% H# Q- K' J  T  s, T% e+ O
(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
1 q+ V) }: Z3 p* l! W$ F$ U) M$ R9 p( j7 K" t
使用共享密钥加密信息
7 p* m7 m8 M& h8 G- M- h
2 [+ ^6 ~1 l. ?( }信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。& i  C! l: y% G3 c, j

/ N7 w7 N$ W' h8 w1 M  oAlicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob, q7 e# y1 l6 ^% \9 m, Z6 e) B$ D/ F" L

  C6 r9 }: E& w2 M9 b( g3 ]! i8 ABob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
1 Z  Z7 g( O/ c4 N' u  Y. ^6 K. i( l0 Q+ q
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
& t' F5 s5 V5 }6 ?; `3 W4 U
0 O' D$ m) Q4 q, `所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
6 @* A; h3 x8 w) W5 `, d
( n9 Q' Z  |! j6 m, W3 G# I使用共享密钥解密信息* j& d: _% t  n- a5 r- N* @% R
) T! D, I$ I+ a- s! I
这就是使用ECDH加/解密信息的方法。6 ^* o' c9 @4 \
9 O/ m% ]) F/ p" r+ F
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。* f; v+ ?  k: h/ t: q
+ }/ z2 K) t) Q2 b. `$ ]
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。: M, w* Z6 B+ C
+ a$ P9 Y6 M  Z8 P, c
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。
4 V0 P! @: `  T; r! F) G
- ]# o& g% Y$ z- h) G/ Y: M8 n她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
: ?0 X! d9 V! l) E$ L8 w4 @) j' S' S6 I% }4 i; \; z
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13