Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
295 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
- H! u; ]  y- u) b+ r/ Z3 E' x' p" ]8 }' t& @5 X8 W- W2 X5 I
首先让我们再来研究一下NEO区块链交易的剖析图。& v) i3 l% p) [$ X
+ Q( x  U1 g4 s! A3 ?
NEO交易
8 ]" b; x) w! [9 K
- Q* ]! q" \' k3 ~8 O上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。: ]& k+ `9 e3 L8 L4 C; Q

0 Y8 p& }& t9 m关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。
! I6 l' G' j/ Y; u# J5 r  D
- w9 z( J% N# m  y7 o1 M! g例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
( Q7 ]/ z+ D! A& `0 W, G) F
- N4 c( t5 ~. f; N5 Y回顾总结一下,我们希望实现以下目标:
1 v7 K1 K4 P8 t+ J1 y8 L1 F' a' Y$ x
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。% Y2 i8 t' T' F8 i1 Q1 k( p2 N2 I
$ ^' X  ~; Z. `/ O5 Y5 r
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?* v5 P) ~! o; |# G5 |2 G2 D
" L6 ^6 q8 {& {1 I% ^# O/ Y0 R
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:1 s& X5 ], Z. @
- f3 h3 l3 q  E3 m. e5 H
生成密钥
' b- X# T0 I- c; H, z& |. J& j, _( [) U' F5 I8 O
2 将密钥告知朋友
: B  h/ ^( {# {! `9 I* f" F
4 B  l) ]1 p  z3 X, s6 |使用密钥加密信息" L0 P- V( o" d+ n
: e8 ]' m0 h6 _1 B* H$ V
将加密信息附加在NEO交易的交易属性域中并发送% C& ], }$ j8 q- v: @% \# k
9 K) U% r2 L/ }# u% c) N
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。! j5 ?  d3 _3 Y0 @4 g/ S

0 a; y' l+ `0 v! O通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
( J1 o# H, B, H' l  g# x' m0 x- ?0 g* {9 M9 h
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。" D8 M& I, B9 P  n4 q4 ~

) Q- B1 ~; }! d$ V: X( Z首先,Alice和Bob拥有一对密钥,$ ?2 v* N0 e5 W1 x- c& r$ w
( Z, K+ I9 W0 k
接着,Alice和Bob互换公钥,
4 [' D+ c" z" V9 g9 E) i' u! s8 r, @4 E( f& l
Alice与Bob互换公钥
) B6 `' u' ^" q( a9 d+ I, R  ], N5 A4 W1 e. |. R
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman
6 [$ F/ x4 O% Y8 I' y! X" h
8 k: b- f* p, J, t( VECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
& V& T* Q) A" e4 F0 s" N7 x/ d  ]) k& R/ }
那么现在加密所需的所有要素都交代完毕。5 z, A# f) B4 [; H' d) Y, d

0 T' o6 G1 }9 `" ^2 _使用公钥和私钥生成共享密钥
/ q7 ~. r% L5 K; O
/ e; t: E4 j8 D我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
6 G9 \" v" p. Y' E, n/ l& i  [( G3 l  y  b& k6 v7 x
下方是我编写的Go程序,演算结果如下(私钥已移除)
" r! m5 G6 ^  A
! I/ q$ K/ N2 D  LAlice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
+ \6 f+ D$ O% R6 C4 ]+ c5 m& M& x$ ?) h8 i( Y$ t  u% n6 x( Q
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
" z# h8 h4 P3 p( p* C
$ N, y; x; u' V  C; L. Y2 ^Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
+ d/ j7 R' m7 T: A6 v% S
6 k4 t- [% j' m1 vBob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557$ g" b; s3 I  B. Z1 H$ k4 \1 d7 `, f

& U, g& w& P6 W# S# h4 `! u+ ]8 kAlice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
" u# t% Q8 x7 g  q5 S: j* X  k
- c) W% p9 s2 h' ]! k6 ?Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d54 e) O1 D" p2 J# q

) b! T7 T! n# v+ ^  \* u1 o. ]结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。/ T- h( N* f3 Q- X/ V0 J! j# P

" \$ O( Z  l- F8 V现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
: E$ N( B0 Z/ S# x% s
+ {4 z/ R1 i# ~4 V* |$ i! e1 {(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。9 Z3 l& ?, {' n: f5 y) O7 I

0 |. }6 o- \# ?. D+ ?使用共享密钥加密信息
  j$ F8 e+ ^3 J) g: k5 M/ u4 ?) K# L$ |6 |
信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
. d. v/ g- O$ R6 x/ l0 I2 ^, a" c- o2 t! F! Z
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
% u  S! l) w7 D1 B6 X( U5 O. d
( c0 _2 v  z5 m4 G/ ABob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
9 R- s, k" f* i' d3 r3 _1 X. k2 C* c3 v
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。& q1 p' `3 T8 e- D* Y

8 v/ B; f! C1 O  x; h) X所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。. ?2 a$ s% M1 H
$ L& X& V2 H3 w* m% K5 |3 G# B
使用共享密钥解密信息
9 ~! i2 }# x/ u! V, W2 f: g
9 f- A( i* t2 g7 W2 t  S( D这就是使用ECDH加/解密信息的方法。. x4 Z) Z  y; p: o; V& n

0 x" P1 n; P6 C6 M0 i回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。
0 `/ c/ A8 C8 b$ Y2 S
' [- n6 D& v" V; E0 L8 [" zBob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。% w  r1 ]  ]# r5 @

7 m0 _; B2 s" s% e+ Z  w$ P鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。& N& ]$ i! m& y, H( c
; A0 x  K' G) S5 w$ v, j/ I. B
她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。+ J! {. t4 T& ~/ ~0 C
* a. E; B0 w) U
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13