Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

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

$ x, \4 J+ ]* V; L0 @首先让我们再来研究一下NEO区块链交易的剖析图。( `) y7 {2 R0 z4 Q; \. F1 I% K
# q# B1 Z/ R& }5 i
NEO交易
8 ?. R6 i1 r7 ]/ w  |) Q, X
' j2 R  K6 M9 o/ I5 X: d* w2 `" v* e上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
! V$ n1 f" I5 R& ~, N9 a& P' |0 Y% M8 O' s5 p! C- K
关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。" u+ g$ b3 `; K8 g- E+ L

3 D1 W% d3 g' U' g+ F( j例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
3 U8 J7 y) y7 F$ u# g% r
; F6 p4 q, [# I# P回顾总结一下,我们希望实现以下目标:8 f# o" z& I+ _
- C4 z8 s6 N2 ]* j. n
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
) a% I& k- f5 _$ k0 ^5 _% c9 |
! l% ?4 I4 I8 Y5 j2 G4 N但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?
/ m+ u/ z! n# R) f& ?
. o8 N' s: ]; l% I回顾总结一下,在区块链上发送加密信息需要完成以下步骤:. ^  R" L) R& F" Z2 l) V

, a" m8 U# l! C' l/ b生成密钥/ b0 d( q: l# @- P" G

6 g2 {$ Z$ O/ ~. l2 将密钥告知朋友1 n8 X0 p' {7 C: M5 K

2 Q, Q% q& a) z( \+ }8 n使用密钥加密信息! }# d- a8 @9 p% l
! \- [( C1 _; c/ ]2 Z% C8 a& M' c
将加密信息附加在NEO交易的交易属性域中并发送
1 s( w% I9 a0 q" q& I+ R" |! G# T$ J- \9 ^  L9 e. A
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。
0 Y( H# ~* N* |2 h! M# E% I) R& b1 U* g7 F7 F; V
通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。; c5 |0 I9 `+ j. e

6 [/ E2 v7 e) ]我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。
  m7 c# Y6 n6 ~& U- ~! ?
: s. @0 h7 W% H" p7 I, x/ Y, {% w首先,Alice和Bob拥有一对密钥,+ ~- h1 x2 |0 N  K

2 ]% m6 q# P; r接着,Alice和Bob互换公钥,
3 x! i" J( w; N! _) A5 u/ F5 \/ j0 e) t! P  S$ {
Alice与Bob互换公钥
, e- N9 Y: z' [6 v2 y1 z7 Q+ a1 m, K8 P: [$ R7 I6 U, @/ @
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman
! q8 W) J! ^. m% J: z0 q! m" c/ t( s2 W
& h5 l+ j; S$ ], tECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。; K; Z: G  H4 c
9 r/ ?6 V8 z- |7 J# [7 t# E
那么现在加密所需的所有要素都交代完毕。3 \: b2 S8 q  Y& E( p

. E: x6 @; P" ?使用公钥和私钥生成共享密钥
# D8 j) j6 R  \- q. N) y! F- ~& o0 _* @" f6 }( F
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
/ J( W' q2 Z8 s  C0 u7 B# ]! _2 {- X/ K. v$ v: [9 G% ?9 w3 B- P
下方是我编写的Go程序,演算结果如下(私钥已移除)1 @2 y3 ]& W( n" `: L" {1 C

. r* {- v$ z: I1 i* o- r2 kAlice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
7 O: A" |0 H; M, `4 U: v* I! v5 B1 j
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW0 n  J( V" L/ i

8 z4 {# m  o( y& {Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
8 n9 d" v0 w" b  H5 ?, i2 {% I; e* Z8 T- _' |- a$ M/ {
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
0 C! i8 b5 b* V: Z* K/ }
6 i- S* W6 F0 e+ E. TAlice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5' ^) p5 a4 J( Y+ F4 ]
0 H& x8 y% t5 [2 L) P2 n4 H2 m
Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
3 |  v$ Y! {+ ~  B9 H& R' Y% A$ h
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。5 N6 V5 U& Y. }1 M% v6 z
" z0 r" K4 w. g7 T- ?% o
现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
  h( \. Y2 a5 U( t) S
0 U% _+ w' ~' Z8 A(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。; o7 b. o6 b0 c! m* J  d

% `& n, r/ O- |* D使用共享密钥加密信息/ z( X0 d- o0 L' e8 _9 @

$ Q3 q8 N" K5 Y5 O' }! T信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
6 x, p  h7 `1 }7 K) e# I0 C7 k. ^# x( m, z- R( F
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob6 ^  V4 H- t6 r8 N
! ^. U: g. N8 _
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
" _& e8 n9 J" J, c6 `' L' |" }8 p
! i: S. t$ R$ Q/ }( X9 O* I8 |" Q在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。3 S% O1 T& R! H7 ^  [# S% e2 X

& L! d& B5 z! G$ T7 v4 l所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
% a7 K- u5 k: [& i' ^  o0 i
/ z6 s# Y# E7 p  p使用共享密钥解密信息
! b' m; i; @# x
& [0 Y7 Z6 N+ K这就是使用ECDH加/解密信息的方法。
9 h& f  V' r$ U0 M( k2 g. v# G- b, B& P$ @
回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。
$ y- {. l! N# ^. _! ?1 g$ A& ?7 V' D5 o
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。& u* [) H, x+ D  X: w+ E5 a8 R
& d, I/ B" m9 W9 n" }' e1 A
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。- d" E( G3 i- _( y$ G* w5 u
' E9 @! z- w9 x% r1 C3 L
她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
$ L4 \2 t/ Z4 H+ P
; h2 ~& S9 V1 B( M$ y! K" @收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13