Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
294 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
; B+ b3 P+ G! p6 j. ]0 [6 K2 u
0 `3 M% H3 e% L+ }, N( M首先让我们再来研究一下NEO区块链交易的剖析图。/ b5 ]# F2 a. ]

0 ^* G5 B. C* `: c% g. jNEO交易
6 Q7 H+ V1 I. N2 Y: i# Z' N7 T3 P/ O1 I8 @/ E& }# s+ P0 S0 ?! v
上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
# C# @1 l1 x! F
& l: a( ?) t: M8 x" z* @关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。* _# z5 I: c' k' {4 j$ S( f
' e9 K( l8 V0 ?- g, l/ o" U
例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
# H  D/ x; U1 j0 m$ E! I% C7 n/ e0 |. u+ Y  W% y
回顾总结一下,我们希望实现以下目标:
* I: c1 u, b1 S& ?6 L* k2 m, X  |+ U
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
+ r6 m, [) H! ?  i( \3 O
' V: A0 w/ ^7 [0 A# S但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?: K/ O5 [5 f' V* C5 Z' s
# r4 g! S- H7 d
回顾总结一下,在区块链上发送加密信息需要完成以下步骤:/ H- W" R! \. y9 L+ Z) f" ]
0 _$ J2 S$ q6 Q' |. j5 ^, Q
生成密钥" [. G5 Q9 ]3 Z9 @5 @  t6 X) J& V. l
8 [8 p3 w  }1 H& x+ u% g
2 将密钥告知朋友) ~) s. S9 ]8 d$ \8 K6 M7 p
  i2 b* j9 P1 Y8 w' a; L$ o* X$ _
使用密钥加密信息
* K( h4 G, [6 ~2 h2 c  V/ \4 b
* r9 Z4 ?, i$ K3 ?. ~将加密信息附加在NEO交易的交易属性域中并发送
( s6 M% L" @1 P% J, i, D
! v& H1 u$ `; @0 B  y7 A9 A' X- I创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。  N% O" K2 z7 @# [! ^
8 d* K  G) Q% Y1 ~) J
通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
" O# v3 C5 q0 e' P7 h$ I3 S6 p1 g, _  V& A: }
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。, c: [/ L2 Y7 z8 J

2 f" l! |$ E" ?首先,Alice和Bob拥有一对密钥,
: x- i! A$ ^. x/ n, m$ _, m6 G3 `
6 {9 f! y9 T; m3 ^$ K- i* R接着,Alice和Bob互换公钥,# D( [; [( q4 X4 [9 M% v' X

+ h3 k: [7 u# B$ IAlice与Bob互换公钥
& ]; @3 Y6 B& k9 ]
+ c  v; l& h4 l) q1 q& S互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman! U& R3 J8 y. f: Y( B& q8 w$ p
9 E, C, X3 q! b
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。
1 r' Z! i# [: L& q' M. F
7 \& P9 W9 f3 w6 }那么现在加密所需的所有要素都交代完毕。3 q/ r+ T8 K( ~7 o
; b7 l. z3 w* }& P
使用公钥和私钥生成共享密钥
: T+ }  s& I* y6 i& q' o
& f* `9 Z9 q- [' l/ ^我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。+ H2 B9 a& ^' d4 e4 j6 v. i2 X

. x: v- i0 q/ ]) i( W下方是我编写的Go程序,演算结果如下(私钥已移除)) o5 }: f* |- H

/ Q9 `6 w/ I8 g1 L: j" AAlice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5# r( V& i3 @+ v8 r! {
. S9 d1 ]9 r% o
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW4 g7 q0 {- [, x
( Y$ y: a/ o# T' g& q4 T
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
0 Q- l9 h/ q! d) r; R# D: r- [* N+ A" E) i) t
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
9 M% K; J0 a* G% H" [' K% Y7 Q1 c
& D2 s- L& U" x7 S+ n* o* VAlice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5# R7 q5 s  {& P

  i2 p  P- h& a. c) M7 `Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5" ~1 f- U! n0 p
. a) d* N; h/ r! {, W) M" c
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。
2 v. b/ V/ E" V
& z' N' u$ F9 x* p8 r0 o3 x' `现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm2 ?% o' j' X& ?6 H% `7 N$ P

3 O5 B4 x3 g$ C(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。2 E9 E! E$ i6 q) R& H4 e4 ^

: i0 U. Q1 h# [% G  r/ R9 Y使用共享密钥加密信息
8 i, j3 G& A1 t" ~4 c% S% {" j  b" p! \6 r. u5 z8 o4 Q( u
信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。
& O9 L- s3 {; T, j: G
3 M3 u; g; H4 @" K2 OAlicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
4 a1 m5 T9 ^: ?7 p6 {; K
$ q; X$ K/ j) @7 M" ?! I7 pBob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice
6 Y. k3 A3 U0 F! U( z5 H& v2 O- T5 {5 U: y/ S& R( W8 [% ^
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
: ]6 Q* Z+ d# W+ C7 G+ E2 p2 p+ H8 n
所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。) N% |2 Z6 g' ?
- U- S. ?: R) Q  U6 E
使用共享密钥解密信息
, B; s) f/ L% k7 Z$ {& G$ K
( B' q% p, \1 }) ]! t- q这就是使用ECDH加/解密信息的方法。' E+ G7 p( c2 p$ G) F

/ ?; V. J: L+ l回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。
0 {" Z' ^6 X& P% J9 O( c/ g  Y0 U2 t7 P. d) s
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。
1 [3 y2 V# v9 Y7 h* I# N
) m% _' M9 _3 Q1 O/ d6 v9 L鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。
% H9 n, H2 s1 q/ ]6 K) z8 t$ q0 d. Z  I1 X
她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。. _+ v" }5 z& m2 `' ]

9 K6 o  o8 d. J! d& D% U, U收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13