Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
342 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。9 x* H' I( R3 a# a/ h
6 K9 _. `, @$ p: |( N8 B
首先让我们再来研究一下NEO区块链交易的剖析图。
5 l. c6 Q: g* o* q/ n: q
1 `1 t6 s* }$ p' MNEO交易: x: Y" c2 k' c4 i' B

# B; ~; ]. d/ W- L! E# e上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
. G2 I. k, H1 @, N0 F% E# B
! A/ `' ^* s, D关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。
5 |$ H+ h2 c) [2 W1 B' J$ @$ |+ \3 c$ Z6 E3 X% Y
例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
. i% T9 A0 x8 p; o
. M$ ], l5 d, a% i/ m7 d2 V* `回顾总结一下,我们希望实现以下目标:
. q, z' T  `6 d+ `- u& C) \: z( `' l6 s3 v# d: ]& S8 r1 X$ [+ v
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
7 ?2 l8 a) I0 s" C6 |% T( `1 p' k' G# L$ c$ Q2 i. E) b5 f) H6 b! r4 t! p5 S
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?9 M, C, R! K" v- f: {4 W& G0 t
+ p7 S5 a3 v$ f" _. {  z! {
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:0 D9 F6 V& r" |& H& r2 g

- f- ]6 z. P5 n3 a7 c3 W生成密钥5 a0 l4 x9 K1 l# v# h

5 `/ ~: I, f. A/ @! K2 将密钥告知朋友) ^3 {0 i. n( }6 c

  }5 e# `+ K$ @5 T/ m9 @使用密钥加密信息
& y/ p( ]* A: H: I+ G
$ Z1 H$ ^- n. x将加密信息附加在NEO交易的交易属性域中并发送1 d2 K  ]* g/ Y2 k

) {' I  I" ~9 z创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。& s  l- I% V( Q6 X
/ f% S1 a& G$ D2 _* M
通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
7 n5 B' H5 ?; V$ U, ~. |) a- d1 m- j* E
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。, z) \& O6 e4 [, n$ \% l2 J) l3 ^* o

  M2 `! z% {4 R" {7 {. ?- U3 y1 W( h首先,Alice和Bob拥有一对密钥,
1 S/ X2 t; t% Z" l2 t7 o
4 k- E$ Z; ?0 z7 i2 K. k# D) G接着,Alice和Bob互换公钥,# i8 _. |) b7 e; b
" [# u4 X7 s$ _5 C) Q9 |
Alice与Bob互换公钥8 _  ^9 Q  `- t4 s% p$ z

' h) E* F# z) ]8 N互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman/ L7 W( E: [; v' A% B: ]" ?
; @) ?$ {7 T. Y' W: p0 F$ u5 M
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
2 A6 _$ K, V2 Z% M
' t1 ~3 l% q! s' U& H+ v: H2 }那么现在加密所需的所有要素都交代完毕。
7 D! Z/ s  e6 [0 r* {% [) C: d! `/ P! K4 t
使用公钥和私钥生成共享密钥
1 a# l7 J" T- y! \! f6 k8 M& s) c5 |6 S+ Y5 p; `+ @+ ~
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
+ V  b$ k, D6 g, ~4 `1 N  m* x9 ^7 t0 m
下方是我编写的Go程序,演算结果如下(私钥已移除)
, M" r$ L4 s4 c' Q9 L  R7 y/ N6 n# ^1 ?' J5 k
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5$ w3 N- {$ @" W* N/ n
7 Z; M6 m; @4 L( K$ u
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW" t7 u" Z2 U) X4 p7 g% A, U
. E) E/ n5 G, t
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da! |5 l+ X# I: V& N4 H3 H" P8 M
1 F" f+ ~& p' a# d7 c
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
! I# Q8 m9 v1 l/ i, P/ c# G! D; g. z9 x& V) c7 a% L% r' A
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
( q1 [& k5 M/ j0 ^5 X. U
* V6 e/ ^( K  i  f# N% V3 HBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d59 s3 l+ ~9 N: G* k- G* g( d

7 l. J5 B3 G9 k, o) ]) v结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。  N& E# Q( `  ?0 S9 v( P* I

. t2 V8 I8 C. V现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm/ B0 |5 T! u( H' H

8 j3 r8 {3 v0 r/ u6 \(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
# J# F4 x' v6 F7 c% q8 k+ `4 d& X2 [+ {: k; R1 O+ O: M; M4 w
使用共享密钥加密信息
( E1 A- k3 A# F+ l; {' L7 p4 ~7 x8 p" f
3 }! v- h2 R: U, ^" I6 B7 j信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。* V5 Z! N; r6 [. ]! Z
' i9 D0 o: ^. K5 I
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
! X, t0 Y; x4 [- [; d/ n" u* I! x5 ^9 \7 y
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
, h% U1 H5 X6 Z: U6 u1 C  U% P) W! q. Q! ?) o# F9 z) o
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。1 M5 k  J4 v* v

! u8 J& x3 @/ p" l6 o6 W1 h所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
5 O* {& \+ i( z* h7 a; b+ z8 ?9 j8 o; K% F6 ~6 C
使用共享密钥解密信息- D. k) p/ H! S/ A( q" C, ^4 f

. u& y9 q/ G' V这就是使用ECDH加/解密信息的方法。
( V: J# L' x9 {% r0 q9 I$ j1 s' ^. g8 S! l3 v
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。4 s2 h6 Q7 G5 Y" J5 }7 P

7 n- O3 z  h! ?% X% ^Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。; v8 h) U8 |7 z. Y

- i" r$ W, G$ H" [; O" i  l鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。' Y: z' c/ @8 M

& s0 @- ]$ z* [. {% N+ J: o她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
5 X* s& V0 e* W! b& o# f, U3 D) z- o: g9 Q% X
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13