Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
319 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。" @! H; f) R0 M% z5 t( U
8 R% I% r: k" q
首先让我们再来研究一下NEO区块链交易的剖析图。
0 v3 d8 }4 s" C% _2 c- i0 L
* h+ E3 B; E, n# A9 e" Q/ K" dNEO交易; T; t- q2 I$ |& O6 p+ G& d

  q7 L( a, a, C+ n2 C6 A上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。5 L/ L( E6 S) R" {; s' O5 K
( [  f% ?4 x+ j% R" z
关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。* i1 a; M3 b) V( _' M' p

) M3 o. |' u; ?8 J. T2 v例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
5 G0 p/ ^: l# B) t8 i( p3 |
7 N# L2 k& Q8 _! `回顾总结一下,我们希望实现以下目标:/ O+ D" o0 |4 ^
' v; ]) t2 t' o. |5 q5 f2 ^
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
5 k( }; @* v# }) }, [& j5 Q: I8 F* d, `( ?+ W$ V# K4 q% `
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?1 X, F2 i9 \. L0 b3 l4 R  c. v
1 n% q' U& \7 ^0 l3 e& A6 C9 A
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:& B( R3 c; |  V

- B3 u; }/ f. h  P: i1 \生成密钥
' S# }$ S3 o3 u  ]" n6 w" q# O( J" `& S8 H
2 将密钥告知朋友
2 R) ^; e6 ~! w* @2 _% V$ P4 {: _8 E9 ]$ c, M
使用密钥加密信息
$ \/ L. [) a  B0 x) n; a
/ w# g/ c0 {8 @. W6 V' Q将加密信息附加在NEO交易的交易属性域中并发送
" e" q$ K  U2 O5 c5 l4 @! l$ f; o6 A5 E  l! ?7 i  o
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。8 L* d6 W& y5 A8 Z$ L& q

, d8 h' o7 j: ]2 X) j通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
$ c0 r$ B! Y- G9 Z0 A! K, c" B8 s: `: T$ x) w. C: j
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。
, s! m2 `3 b9 Y' q+ d, F
  }' ~9 d$ a7 ^8 i  k1 O首先,Alice和Bob拥有一对密钥,
+ J* L! ~7 V, R" N" R3 J5 O$ C
- B% }7 p+ R9 g* r# v* }. b( F接着,Alice和Bob互换公钥,
3 @: W$ E- h9 ~* U
+ N( Y' A$ M8 ~2 v4 E7 `4 P$ hAlice与Bob互换公钥
* W, E, f* ~9 \+ c# g1 L) M& U; X" P2 n2 s& ?+ n4 w
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman1 C% l! o& b/ K  i  l" p1 Q$ _

" T5 V% ~& s7 l' E# \/ a/ bECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
$ t2 H0 X8 @; N( R3 A8 t8 V( l$ N9 _* |7 l! h4 V! L
那么现在加密所需的所有要素都交代完毕。9 l6 C; X5 F5 ~
$ `% V( `3 P9 ^/ E. `( U
使用公钥和私钥生成共享密钥' i5 o2 c3 }2 k. p2 P

/ N" r- r& `" D+ _5 B& F- W1 i我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。, t6 ~. l1 X- Q: ]6 s; t2 D. J8 F

7 H. M6 w- I( \/ u# h/ P& O/ {下方是我编写的Go程序,演算结果如下(私钥已移除)
( u6 E  _- b2 G0 T
) T* }# M! ~; _Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5' K$ T6 x0 I% @; Z* ^
) j7 ?# b8 f( V' j5 y" Q5 W, [) ~
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
( t& m; I' w% e6 }+ F' S6 G6 T4 d: |* e2 b5 J: b& z
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
% }! \. W4 ]4 ~9 ~8 e( w
% y7 Q2 A& |( z9 A' OBob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
% s: c) v6 s0 i/ r8 l4 Y% j2 D
% g3 q) N& V6 B9 r, Y; iAlice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5) i$ u5 w7 C: x

" p- f& |( y" y$ O. Q) ]" p* oBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
, |$ F- B% k9 h: M( U% `) i! n& ~7 o/ L4 U+ ^' s
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。
5 b& z, A% g: A0 V
$ Y' Q; c# k% ^5 Y- j; ~7 r现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm0 e- p/ ^2 o  x6 K& w% N: [. r" w7 z

' D  R" R+ E9 n$ I. l3 Q(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
7 c2 `4 q$ G6 }$ i9 t: X) |2 v+ V' J# ^2 o1 [
使用共享密钥加密信息
7 z. B  M, l+ b1 P" F
  X% K" Y6 u  K* D8 g信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
+ w: {& q% K4 e9 w7 Y8 T* D
4 p7 n* N# _0 E5 e) ^0 E) ]5 vAlicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
! Y4 D. L( p: i% K
; V* f2 w: {, \4 VBob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
5 y1 `; r# }& W& b3 H" r/ e* J
2 J4 t- c8 D4 ^% O5 o  o在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
! Q4 u( d8 P) b  Y0 T
6 b" X# x- m8 L, \所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
3 v5 |/ Q9 f$ t% x, J3 f3 `
( W% m  P' F) ^8 }6 Y9 {使用共享密钥解密信息' ]' o+ X0 I  {; J' @
) S( _& T0 w7 ?- ~' O$ @, u( X
这就是使用ECDH加/解密信息的方法。! {( s5 e* M  g: V8 m
& d, {- J8 [5 G
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。6 A6 _% z7 T: L. b8 {# g1 u/ J
8 s' K+ U, ]9 B
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。' C) V: ~- ~: J. r! g" u
8 _% ]% s  V( C+ c  C! _
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。+ t" J2 g7 n8 H$ d2 W

# w: T& [0 [$ t1 ?  f5 x# C) \她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。+ Q% y: R% Y8 D, P( d  p2 ~5 q
/ B0 [8 W. O* ^) A9 J$ R% z. B3 m
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13