Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
307 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
/ q/ W! h+ z% ^  l4 x' ~/ j
3 {' k' p4 B' l) L/ i0 T, M4 Z首先让我们再来研究一下NEO区块链交易的剖析图。
7 k  H9 ]$ }" L& t* k+ T& s8 d+ e5 O/ o/ Q
NEO交易
  k/ E; _3 l8 c/ |
1 `4 u1 _3 Q0 y% W" Q7 u  q上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
' n* Y, L$ W' M$ S/ n' |9 }
2 m4 ?+ @/ b. t! O% I4 [- T关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。9 N) c/ H8 T) R) O. D

% ]9 g$ C2 L5 U) [; b例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
# d% Q6 a8 V1 [$ h+ x% E6 w/ D( s! j. I8 n* E. A: H
回顾总结一下,我们希望实现以下目标:
! v& i. M4 c; |. b
, V8 J# I* @5 X/ T& v0 M. Q上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。5 o) z4 u! h" Z) X! D: }8 l( {. m
+ [: P3 M8 {( l4 y0 w5 i3 b8 N
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?% b" Q" P2 u' q

& f/ H1 V7 x+ _0 d6 N/ E3 g回顾总结一下,在区块链上发送加密信息需要完成以下步骤:
* i5 K" r: X" R: ]- p+ R
% Z4 ~7 u" T& r3 E, G& O生成密钥
5 a, ?' }+ n  e6 A1 ?; f1 R. T" {% m
2 将密钥告知朋友! k& z" ~4 k0 f1 e. E

0 c( g, T# P4 r) {" b1 k9 J. n) w使用密钥加密信息4 c8 B4 Y* X6 n- G
; ^+ B: w" Z1 @! b( y0 i
将加密信息附加在NEO交易的交易属性域中并发送. D7 ^, u; D7 \- M# U; V; T0 P1 r
$ B) s0 f6 l5 H' e* x! A, l5 F
创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。7 X/ G; g5 P, F+ b1 m
# f& Y  [0 Y9 _$ z
通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
8 I% v* Y3 L1 r4 }9 Y0 B& R" U0 W- ~; c7 }
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。' l4 M2 Z7 r% ]" J+ [: `0 W
0 ?5 c$ T5 \; O  f' ?
首先,Alice和Bob拥有一对密钥,
7 m- v% Z& i3 A% S5 ^! n$ v# y  A3 _& O4 R, o3 b' E( ]& L  i2 D
接着,Alice和Bob互换公钥,
  A" e# G: |- ^8 H" k
% m: a, B/ P0 v, w) d6 k0 V8 iAlice与Bob互换公钥
* F9 t+ P6 D& g5 t5 i7 d6 j' m; K6 E' t( M6 a
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman7 j4 f6 d0 X2 \2 J3 Y9 j$ P. P
& U1 ]. K* V$ F5 D4 W6 L
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。5 g% F0 l1 t+ I# u! h
4 t4 f- r8 H* Q3 B! m5 c
那么现在加密所需的所有要素都交代完毕。1 p' r& A4 Q% \/ G- \  I
. {4 @7 y5 }% G8 `
使用公钥和私钥生成共享密钥& J: P5 T: B: `0 Y% q$ K
: }3 d1 [& v4 O! R4 d
我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。- d: U/ T- l! J3 p
2 t6 _7 }4 \* o; E# e/ S
下方是我编写的Go程序,演算结果如下(私钥已移除)
( q' ^' p# ]4 U* I% m/ P4 ^% T. v0 g' g, a
Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5) [) N' s* b3 b, v% S  P
9 I: }7 N5 Z/ V- D1 e7 {
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
' P( H# H- V0 S" O( w
; W% A* P/ b: r4 {Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da: _% d$ b$ c1 p  r: o: a
9 p8 E4 g2 R  f* @5 \
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557% d3 }) {- r! U8 |* L
" Q1 m- @% J  j1 u7 z+ q
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d56 t5 B( w+ V3 C- v

4 b6 l: @/ N, J- f) W, q4 N! c* E7 hBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
& K) [* z) C) W
) {) a; m+ J' j4 q- |; a) K结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。
- c/ q, ]. z, `# g" ^
) M' `* M( k9 U现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm9 w$ `/ ]/ R! e# ~3 G  Y
7 ^: @: l8 f- m) b. z: V4 y
(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
0 e0 Z9 V* q1 u/ k' Y0 P. T$ }$ M+ X5 Y! h# \5 Y
使用共享密钥加密信息- E6 N# Y# ^! D3 r  z

, e) b8 P. X9 l信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。0 _& `0 d$ @# n/ e% }
+ v- q0 {* @7 ~0 [! O( o* H
Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob7 j8 h9 N$ g9 f  z  m' }3 K% ~; c

7 C. w/ Y( [- Q5 ~+ n, D. o0 QBob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice& ?) O% E* _. |7 I! D, j

6 j% E8 V$ k. |9 q! V' ?* P在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
- f  Z! W; m2 R9 B# C# a7 x
% ?1 ]/ h$ T, y/ ^! ~5 {# D所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。# `3 y; Z  H1 e6 I

+ ~% G( D. i7 ]! @( K使用共享密钥解密信息
# p: W+ U. L. ~
5 x7 x5 y, ]6 m4 H# w这就是使用ECDH加/解密信息的方法。
# d( k5 c' N+ d# L; Y& \9 q4 d& @
- r2 S" V  M0 B( v0 ^回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。1 p7 C6 C# [1 o+ Y" h0 X
; i6 X4 \1 w/ r* ~# m4 ~7 q5 p" |! Q
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。  h0 `8 O$ m+ S# p8 L
/ I3 D& L+ ?9 J4 U8 z3 Y& {( H0 k
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。# W+ R# e8 i) O0 k
7 K" B0 R( d7 L4 I
她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
  x* T7 K5 L! e3 s9 }
. w4 E9 ~; C) o; h收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13