Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
289 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。0 @/ P. P) E  c& G8 L' @" }: \2 C
4 T2 D) [4 Y6 A3 e3 _% e
首先让我们再来研究一下NEO区块链交易的剖析图。
' g- B3 A' P% X2 y
2 D' @) e3 p" ^. v# p8 sNEO交易
6 P) |! \8 n, k8 ~6 l- I
* u  Z' W: B4 B0 m4 [1 X; v1 V上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。1 f4 I) N1 [6 ^/ d0 F  n

/ |" [: U5 O1 m9 G5 j, U. Z0 i关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。
- Q7 s$ C9 R! o; I- B' |, G
( Z! @; A: i; M例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
' ]/ o! k- N9 c9 f$ j5 M( x0 j+ I* p9 z3 B" t6 [
回顾总结一下,我们希望实现以下目标:& W$ Y& H  a: l) C: A4 A; ]4 m

- ?( R8 k; g+ z' q+ n5 k7 l上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。; D* R+ Z  t& b! q7 c7 z; Z
, V( U# K8 {, g; M1 ]2 a
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?2 n$ o; x( d5 R7 i% |

" f3 e4 g: B# a( _+ p回顾总结一下,在区块链上发送加密信息需要完成以下步骤:
3 O& y2 H) y# _4 D$ l2 Q7 G. ]+ V8 |, v% N( P7 _6 |+ J! ]9 D9 x
生成密钥0 n0 ~) `' g: G  V% A

# k' R# U, h- J6 d3 V$ n2 将密钥告知朋友# H3 |4 \3 b4 Q4 w. K/ i+ C

& B6 b; d3 X: ^$ o使用密钥加密信息
+ w- G+ D  m) ^: c
6 ]9 {5 L9 \/ ]% ^) e将加密信息附加在NEO交易的交易属性域中并发送9 k; Z1 M5 t- U* ]6 _

8 R0 x+ J- ?. q& }创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。
1 ?. Q/ t7 l& f* _/ K5 ^/ P: N( S. f8 T" w0 x9 X1 q" e$ B; D( B
通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
4 z4 M! U5 S# i: E. l8 I" D! J* V4 J+ v: C
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。
% r1 i( Q7 D+ Y+ n2 I5 p- v6 v  r1 R7 {3 i" V) {
首先,Alice和Bob拥有一对密钥,# M2 u2 Q' s; T2 X% K' n
. E; l7 N9 i+ a9 f' F! |- q8 C
接着,Alice和Bob互换公钥,
( h7 f: Q$ I" l$ n
. ?9 j& h. f! [1 p% f# {Alice与Bob互换公钥$ y/ e4 d2 V  U8 f

: C8 D, S& X8 `: K6 b互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman- g- J; L1 o/ b6 ]3 j6 b$ s/ x
. n& A6 I( u8 h+ s6 Z" \) R! n
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
; R, v1 Z! u8 v7 ]. X1 L; z7 N1 Q0 h6 d0 t8 y0 s
那么现在加密所需的所有要素都交代完毕。8 B" P, D5 B7 O  k+ o, |$ v1 C
6 }* S5 H3 @6 A' a
使用公钥和私钥生成共享密钥5 Q4 `, d% R- ?  O  a8 \
. p3 w% U8 T- o) y4 R2 @9 V" i
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
: {& c( Y5 X7 [8 }" Z
$ L6 a4 N  F6 L4 m下方是我编写的Go程序,演算结果如下(私钥已移除)
: N& M9 S0 D' h/ K6 R( X- U7 \/ l( }! l6 `3 ~0 d% Y0 j
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
/ Y- T, s9 z& ~
8 N+ M9 t" U. {Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
2 Z( s/ C# I$ p9 @% b! {' o$ h( `
/ E* y- s4 n" I# nAlice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
* q$ p$ y8 L  h( n
# d% Q' _' \! Z' S+ G3 |' _, ?Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
) `( e2 r( U, B" A/ X& S: ~/ O9 |3 b- v4 x2 j+ g/ Z; \  a
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d57 C9 _) p* g9 |/ v' }

: i6 h7 j) j- e8 ~5 R! x) G% bBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d50 E. W5 t( H: c
0 }/ a5 k/ e* {
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。5 d& r2 D* O' ]' k
( v! [  j- ]: t; H+ D$ r' j* I
现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm
7 c: j6 A% G0 A0 U' R7 J7 d; G# r' ^" v; N/ F' i
(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
- {+ j2 a% P2 Y( D6 C3 r6 H
) j- `( U' ]* s5 W: D/ u使用共享密钥加密信息
: ?) z' Q- z) h  r3 Z  J9 }
* W! o" I7 v# L% g9 l信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
8 V- |2 o. ^  ~; l. d$ U) s$ A/ q2 A) q9 F9 w7 N
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
: [& w6 O5 u% e+ |; T/ c+ B: x  C! x5 p! t
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
7 a) F$ |# O* o9 i) O7 x, J: Y2 {2 h& {: b
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
3 r) [1 s* ^/ p& n& j4 q1 d' ?) k4 |* G+ ?# |) a
所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
+ @6 \/ P2 k& [& ^9 B* M/ M
& `4 ?3 P; N* b使用共享密钥解密信息0 Z2 J% o. V1 a

3 U; Q& r3 F  B" `5 A# t$ h这就是使用ECDH加/解密信息的方法。& s* M# M' e0 [0 t8 Z

$ m/ j: i* W( |, y0 E8 W/ e4 Y. F回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。2 _9 w! _& p2 ?) E; A

! e, t) Y# i, n( i8 o- B) uBob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。7 G4 b2 G8 F( \9 h. x
9 s3 Y" V% v8 d5 q
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。
3 y! x* i" F9 f6 v7 M
4 ~1 U4 z" M! m; X4 f她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
5 M! a! C7 X( _* m* B% w6 q* ^% ?
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13