Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

华胥
341 0 0
你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的其他数据。但是,开发某些应用时必须考虑到隐私性,通讯应用就是个典型的例子。如果你想给某人发送一条信息,你想必不希望其他人看到这条信息,因为其中可能包含一些敏感内容。本文笔者将分享一些NEO区块链信息加密的基本知识。
$ e6 e6 y1 @: {
/ @' |& |% n7 T% z9 c首先让我们再来研究一下NEO区块链交易的剖析图。
5 {& [" E! w; S) {( X; H
9 n5 n. x: J2 ]$ @" t4 Z$ g0 t$ UNEO交易: W7 M1 u- i5 `( t2 K8 A1 m) \

! |% W$ m" ]0 G+ q上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。
" @3 q' s  c- c! N, J$ C" P- T* `/ p( W/ P" o, {% E, M
关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。9 o# q7 T8 w* ~9 |3 \
# n) @+ {3 h# l4 A
例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?
3 N+ Q1 E2 E2 o2 Y0 ]! A
2 ~* s9 E- e" o0 o' K回顾总结一下,我们希望实现以下目标:
7 t: `/ P( c% H# r* a! N* A( d8 r5 r9 \! x- Z) E* ]; U; z0 k2 C
上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。
4 f2 F$ A2 \/ [; w/ x! Z0 }' K9 G+ r* k( D3 I8 G
但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?$ {  s! Y, g3 m9 x, e/ z

$ e. f0 v, ]. s' M回顾总结一下,在区块链上发送加密信息需要完成以下步骤:3 n" B( _9 g: d/ a

' [$ S: ]. \+ O9 `% s8 B# ]生成密钥
4 D: o& ]: y" r' i3 c" q: f5 k0 R+ }/ U2 R$ S6 _' b' }, {
2 将密钥告知朋友8 k* e6 ?% O3 n; n. j% ~  |  ^8 u
! t& \9 C) m2 o# ~
使用密钥加密信息8 F, F8 J. q$ X$ p6 @
8 _" ?/ p0 W2 m5 ^* I
将加密信息附加在NEO交易的交易属性域中并发送
: v7 b/ X2 N& K8 F, n; f9 u, u: v
2 l3 S+ L2 l) _. C8 ~& P创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。' K8 p9 N6 ?  q. ^: i

9 W: [4 ?8 e5 I3 {通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。
' n- O5 K, e7 w; e0 n) _# t. A& Q: i( \9 n4 s/ T
我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。4 }) _& N# V) m: @) y

- |4 h- K- O  |5 C, `5 g首先,Alice和Bob拥有一对密钥,
$ x! s" T: t2 L2 T
$ L0 s  b) Z1 a6 _接着,Alice和Bob互换公钥,
4 l; I$ v' b1 H1 \, |
- f* R$ z7 D1 A9 zAlice与Bob互换公钥
2 a. s( `8 t: O% N$ s, n. U2 ?! O6 ~3 I
互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/El ... fie%E2%80%93Hellman. a6 S  r) K1 h$ W
" ~9 v( j: u$ B" k8 {
ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。7 O( l5 Q/ s: X
( U# b$ x  k& s( w3 A
那么现在加密所需的所有要素都交代完毕。
' ^8 u7 A9 e, F! V& x
3 N3 z" l+ e1 w; a使用公钥和私钥生成共享密钥
* B, t6 i: v/ _5 h( v! [
- p7 r# X* t* ?我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。
% h4 H! z/ x  o8 e7 }
3 |' l* o9 R% o! D( |4 Q, R下方是我编写的Go程序,演算结果如下(私钥已移除)
0 C' C- k0 v& B6 w0 x9 J- l
7 l8 W5 ]% U6 f4 S$ C" ?3 fAlice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
' H8 P1 \4 L( C' m' f% s5 x- G, |4 k
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW1 r% {+ Q+ T0 W8 L) T

: K: x# @6 x- G; ZAlice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
1 p+ z; d$ ]! @1 v$ ^7 D3 N/ N% S7 Z" T3 p1 |; \/ M; u6 ?9 i; ^
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
, n7 _& q. o3 w) K
" V# X& n3 z& Q7 E' b; XAlice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
2 c1 [2 u& `% O6 u! H& l! l* T0 i
2 ]. }/ }) @6 xBob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d54 W& h4 `1 Y9 j7 B8 \
/ ]0 n* g% A1 f$ b+ r' d
结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。- A9 |$ g. X! ~% N0 r

" [0 H% u# S& Q5 o6 B现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm- \% k. q2 _9 \+ ^! X* t

& G/ K6 }8 T9 v8 n(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 来加密信息了。
! Y# r' w6 ?, C& S; N% T3 w
& L' C. P' ?$ d7 h使用共享密钥加密信息9 a8 y1 Q2 Y' M8 r
6 }8 F8 W2 r8 {5 o0 J! r
信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。3 t' r1 m3 E& J( E! `

. |, b( e  I: n9 ]0 {! ]Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob9 E8 k3 x* _8 a% M) M

) e5 V  A7 ?" s6 |$ D7 iBob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice6 ^2 z' D1 V2 b3 W  m
% N# k7 M( w) i% m9 p1 D  u1 `( f
在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。
! i" M) Z6 Q4 w, z; {! e% @+ K8 h4 X, t
所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。
% U  q* l2 ]: b8 z/ Z  \8 w: d7 F: q. v: r6 V; R
使用共享密钥解密信息
. C- ?* X+ c4 D: t5 r0 J3 a. A. \1 [, x3 y4 B; H
这就是使用ECDH加/解密信息的方法。
: H* g( w/ {6 M- A* x
7 _! _- X, h0 Y: p% C) S! _回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。
8 p3 ]8 E" g% c, q9 Y. H3 N1 {$ h) _6 k& p' b' I
Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。
! Y( V6 B; z- ^+ }7 t) T. O  W5 {7 D( p. X+ K* }- j
鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。
* g( s# [, L" J
- e0 k) R+ \- q8 N6 j5 j她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。
2 K  m0 C  X# R$ B0 Z' d* B' z( M: X- i. _  L9 @8 x2 g
收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

华胥 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13