Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
191 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
1 @7 P6 C+ F# x/ o/ W
0 x* q2 U* W. e& V0 B& B0 `首先让我们再来研究一下NEO区块链交易的剖析图。( _$ g' @$ L% [

7 J4 x# k. Y) p7 P5 ?( t3 tNEO交易
2 Y4 h6 L, i# o* b3 `6 A. ?9 Q( D
3 {# \. a5 B9 R1 H9 P上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
/ V+ U3 t) `) z1 [; a/ N9 W+ {
关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。' L7 |/ {  m4 N. T; x0 X

8 w# C2 f; J" ]1 j  F/ t( b例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?# S7 e* m+ |& U0 z8 C

: X  Q3 n% W8 Z1 {* ^( C回顾总结一下,我们希望实现以下目标:
0 M9 t4 u0 t, @6 R! q1 P$ N8 T( E5 S8 }  a+ c- @8 m
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。4 @0 @& N% O1 w. ~+ a
; P7 L. S9 U/ W$ r! O# r
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?' S+ k4 Y9 {8 T7 K2 O% j7 U
3 g; }) I7 }3 P: U$ q
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:- g' n/ a4 J4 Q
. P; E/ @+ O" v9 ]/ d; G5 `- M
生成密钥
  I# T! x. I2 Q- Y1 l# v8 a
; Y& N% H! v. J1 x2 将密钥告知朋友
  t2 G( J) V1 x) H0 d. |( F+ a& ?, F1 \" ^/ \
使用密钥加密信息
' U, C! x/ H9 x( q1 H% O6 h0 D
3 ?6 C( l9 D8 p' @* @' r将加密信息附加在NEO交易的交易属性域中并发送
6 ~, R" D# A, A1 d' P9 v
. E% p0 g& M2 A; ^/ O9 ~8 |创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。5 Z: E+ a' x& |. G* ]) b8 J6 b

7 l2 V) n: V& [* U& V: t通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
/ F0 W. L1 |) v! l! X; p8 {
2 m) D: A8 j, G我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。0 `6 W6 o% W9 J  V8 R$ g$ E4 l, Q
" z5 ~+ \! E, H7 j9 B( A4 ?# t
首先,Alice和Bob拥有一对密钥,
* b0 m5 l1 {! O# d# B* G
& {$ Y5 ^% G1 z; T接着,Alice和Bob互换公钥,
0 i' O  z& L# t% n; W/ O- V/ n. x  t7 ]3 {: J+ e! c8 i! y
Alice与Bob互换公钥
% |6 r/ M# [) a" i% m' J0 A: t! ~. Z9 ?. D1 c5 N
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman
5 \/ o7 Y, q0 [
2 t0 @/ x; M3 `! h- MECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。, u# e! V- h7 Z
2 y8 Z  ]& t; D+ \! H5 U
那么现在加密所需的所有要素都交代完毕。
/ e% A$ r& Q9 S8 C; l! ?# I" x
4 K. e3 {% N" ?5 U' ?" u! g使用公钥和私钥生成共享密钥
0 g8 a, Z7 j' {# ~; I- J' k2 Q! m5 K7 _- [) D
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
; `+ x1 X1 T  O6 H
5 i0 F0 ]9 \3 U( T下方是我编写的Go程序,演算结果如下(私钥已移除); e, K; D- E. ~2 U& w* M

5 X# u2 Z1 ?) o$ b/ i. [Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5; d2 x0 }3 `& q- F% I8 _) f2 B

# \7 x2 [" O* A: ?: U( [Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
& f3 F5 g! c# d1 y+ w
) k% f" Z+ [& A) K% x+ e5 L5 v3 xAlice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
; I/ u( Y3 ^8 O+ y$ t$ K0 T2 h+ @0 F9 V8 [0 A
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
( G1 ?. W: J+ `! C- N2 n! H
2 e- Y' D6 I* W1 M$ U5 H. ~Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5- }& c, w* @0 h$ g( N5 {- K
; ~3 \5 X4 K# s
Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d58 G$ }, p) U" e* E8 B2 @
) L6 m5 _! F2 M9 K% k
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。' B% n& n( _2 A5 f9 o: I% J$ c$ q
1 X" J6 N9 S' I, h4 @$ O, T- D
现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
# x2 j% M. v- J) v4 H
4 t; ^, t4 n% @& O7 n/ J(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。( ]) w' {$ E4 g5 D" ]
' x7 l# [  D6 k% [
使用共享密钥加密信息
( h' p5 _+ X1 s4 h8 i: p/ u# |
: |- i3 U+ z" ?2 m, s3 H: n& x+ M( q信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
! b* s& l) X& k$ m5 c- C' A/ ?8 }5 X9 F" b8 Q# C( G+ I
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
; m/ C6 g: `* S, H" E7 z0 u2 S
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
) {- N8 ^4 \7 z1 B2 t# Y. r% w+ G, K- h' P1 f( v' r. ]
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。, }. G: n6 d( ]0 E0 \8 G
, V, C% S: r$ l  L
所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
$ l9 g+ `7 f  n0 W/ P" T
6 p8 j/ I2 P/ G! N使用共享密钥解密信息  @  _% x$ Q6 W, C2 t/ c

4 S0 b' S4 S( l5 K这就是使用ECDH加/解密信息的方法。
+ O7 V, j- q2 E" n- R, F) B, z: L1 E$ N5 O" c9 z- X" X
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。; t2 H1 |- s2 L
! A( A' E1 n+ B4 w; f
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。5 B( _( r$ m$ e, b' I0 N
0 J& n8 \7 h* E) `# x# M
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。8 E' H, _: L+ }3 K% F& B

# f, l- \- Q7 B# {她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
6 T6 `' b5 X* ?$ j* {5 |+ r" Q7 [% K' x1 D
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13