Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
244 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。4 I& B% M% O" A: |

# B6 C3 r8 o: ?& a首先让我们再来研究一下NEO区块链交易的剖析图。
: o! X6 {8 S; m0 R- k# v  D) x2 B3 u, I/ F) r- Q2 R% k+ L
NEO交易- p' \) J0 l* F  t* P* q- ]3 p

  r6 t! \  N( h4 D9 \6 f上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
: @$ `: ]8 \0 M- M# w% q( ^
; s9 ]1 M$ f1 [3 f4 S关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。' w- @% X1 {" W& V
0 I- M/ _" v; ^# {6 y) o: W
例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
4 A& O- F- f" T( Y. y1 M! G, t# ]- n/ {
回顾总结一下,我们希望实现以下目标:- r* v; T8 m+ q1 M9 C, x1 t, Z
' A: f2 v; J) ^6 t* J  V7 U
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
! G! u, V1 v$ K
  `9 ^$ T8 x# {+ j5 S8 R. K& |但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?
, U5 i2 f9 c0 j/ P9 H# |* j4 T6 P" k" @9 a9 w. @4 {) O3 H( ?
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:* ^$ e, l' |8 E* q5 B) m- K& L
+ o2 W2 e3 z8 L  J, x7 f
生成密钥, ^& e+ t& H% p$ u5 u

6 }. V; @+ v; `! h$ t0 o2 将密钥告知朋友, ~: Y3 t4 f& v/ \6 g; e& G8 i

; A: N+ n- K/ ~  }% C使用密钥加密信息
" M) `1 U. I- V& \- k0 ^) ^% ~# ?1 K5 W2 p2 F7 ~' u
将加密信息附加在NEO交易的交易属性域中并发送! _8 w. R; _& k1 z* l9 e5 u2 V
$ C' m! j, h+ ~- l7 C% F
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。' l2 g; M8 R. H& f2 g# o1 B' J

- a# N2 U* v* Y( ]通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。. i. m. O9 y8 [6 G
$ y, T1 {6 A5 ?- J8 p7 B
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。
  I5 `+ @, z2 P3 u- d# {  `
0 W& }. V3 [. U* D+ c首先,Alice和Bob拥有一对密钥,
1 ]' }+ K# }  H" P/ M) ]8 U  G+ m3 J! x
接着,Alice和Bob互换公钥,
" L; Y$ W( a, k3 W- }$ T, R0 S3 _* [6 o
Alice与Bob互换公钥
4 w5 z1 L( p% g' m: s1 t" b- K% F+ P# K
. \' k' ~( b* T- H- i7 i互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman+ G9 E. A0 w/ O! j
6 ^9 }* s, Q! c# W. h" q, D8 ]
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。9 H' a% ]% R7 ^& A

; B' \4 W9 R: J3 d那么现在加密所需的所有要素都交代完毕。
8 g+ R+ T1 s9 i9 s! ]. L8 q2 A1 `4 t
使用公钥和私钥生成共享密钥- t$ z' K! C8 j$ M

: Q: G* ~* f7 r; U0 v7 V我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。' Y, u1 h3 ]9 R% Y0 d* E5 O3 n9 a& x2 q
0 r: B* A4 `* _3 R6 f
下方是我编写的Go程序,演算结果如下(私钥已移除)/ K$ c0 q! T; R

9 [9 z" i) r7 h# m+ [' qAlice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
1 t: y; ^0 ]0 z2 q6 G  |5 ]
% }. c; u/ Y& h+ SBob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW# E9 i( h8 l( x% `. M; y
: _2 w% G  Y# b4 h! t
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
1 a8 v/ `! r$ {: z$ D( L0 j/ Z' a: ], W: v: c$ V
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
) \- d+ _0 Q. \+ |" h" \, t6 f
% L# G1 L  _1 |) U0 F, ?Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
% o2 l. \% p/ i" f& f2 O7 {
9 [# H/ u& P8 ^* [  }. B' p: DBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5/ |- }2 d% ^' e% o# `" |

) b' f, _" x# U2 P( u, W3 y结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。
5 V7 d; X: G1 Y, `8 M8 H# ]) N7 _/ e& e! [: |
现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
5 D- Q" J5 X. g% m; v
5 M7 `5 ?( l* T# O(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。2 J% M: T# ]1 l, P3 ~% h
- L& @+ n- ]1 y' l
使用共享密钥加密信息
* G2 C6 Y" H# }# R. V1 ?' j
' k& J$ [" ?# L0 R/ w- l' G3 U/ v% P信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
2 I/ f7 y" U4 E  R% u; s3 _. b2 ~7 ]) W& E- r! w( `
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob* t! A& y5 T( w- x) d! p. p
# `" y; i8 |% M+ Z) r/ D9 V; M
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice. T1 I0 F* U# S3 K0 F
0 F3 c' x2 x5 R- g# g2 y
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。. F; _2 D5 X3 K
- C9 S9 S/ k6 s: @  _- o- B! p8 i
所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。! b. I  i  O5 ^

2 X- J* z0 I9 }& i4 X4 {3 t使用共享密钥解密信息* n) b1 o# h' j' Y+ A! \
5 Z  H3 P) }/ K8 y+ i; h# J
这就是使用ECDH加/解密信息的方法。
) u$ Z, [) j! I" _) W5 X" d  N: g8 ?9 c; S! m% @
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。" T0 C, U$ C3 Z; ^0 D) S& m1 r
. W8 D9 e' Q1 H  x( t* x# K
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。# v6 K6 a8 ]9 f4 o% g2 H) w

) V9 Y: \7 T& u) c& D鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。6 u& `9 v, i* }8 G- M2 y& {$ o) U. l0 u
3 ]) I  S3 o) Z2 r* W8 S
她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
$ ~" B. n2 R+ }5 G* |& |
: Z4 O4 G# u! d1 P4 E$ ?收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13