2019独角兽企业重金招聘Python工程师标准>>>

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

首先让我们再来研究一下NEO区块链交易的剖析图。

NEO交易

上图显示的是交易的基本内存结构。当用户在链上发送GAS或NEO时,钱包客户端就会创建这个数据包并向全网广播。如果你还想了解轻客户端创建或交易基本结构的详情,请参阅Andrei在Steemit上发布的《如何创建NEO轻客户端——区块链开发者的入门“毒品”》。

关于信息通讯,我们关注的只是紧随输入数据之后的元数据,但NEO交易还有一个鲜为人知的功能,即用户可以给任何交易附加交易属性。交易属性是一个广义的概念,基本上指额外的数据信息。所以用户在发送任意数量的NEO或GAS时都可以在交易属性域中附加信息。注:上述机制不适用于NEP-5代币资产。

例如我可以给我的朋友发送0.0000001个GAS并附上信息“你好”。尽管我举例说明的这则信息看似无关紧要,但它却能永久地存储在区块链上,且无法删除。但正如我之前所说的,如果每个人都能看到这则信息,那这则信息也失去了意义。所以我们应该怎样防止信息泄漏呢?

回顾总结一下,我们希望实现以下目标:

上述操作理论上来说非常简单,我可以创建一个密钥来加密信息,然后把密钥告诉朋友,接着他(她)就能使用密钥来解密信息了。

但如果我想给10个甚至100个朋友发送信息呢?如果用创建密钥的方法,我就需要为每个朋友创建一个密钥,并追踪所有密钥,因为如果他们共用一个密钥,那么他们就能互相解密信息了。此外,怎样才能把我创建的密钥安全地发送给朋友呢?

回顾总结一下,在区块链上发送加密信息需要完成以下步骤:

1. 生成密钥

2 将密钥告知朋友

3. 使用密钥加密信息

4. 将加密信息附加在NEO交易的交易属性域中并发送

创建新钱包涉及四个关键要素:公钥、私钥、NEO地址和WIF。

通过WIF或私钥可以推断公钥和NEO地址,但反之却不可行。下面我们就来看下怎样使用这些要素来生成密码。

我继续沿用密码学的经典案例Alice和Bob的故事。Alice想给Bob发送一条仅限他俩阅读的信息,想要实现这点,Alice和Bob之间就得有一个共享密钥。相当于步骤1-2的操作。

首先,Alice和Bob拥有一对密钥,

接着,Alice和Bob互换公钥,

Alice与Bob互换公钥

互换公钥后便可使用一种称为椭圆曲线密钥交换体制(ECDH)(见维基百科)的常见技术创建双方的“共享密钥”。(https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman)

ECDH是一种匿名密钥协商协议,密钥对可基于此协议利用椭圆加密技术生成共享密钥。

那么现在加密所需的所有要素都交代完毕。

使用公钥和私钥生成共享密钥

我不会演示共享密钥生成过程涉及的所有算法,请参考上方链接深入了解ECDH。

下方是我编写的Go程序,演算结果如下(私钥已移除)

Alice’sNEO adress = AQpkhLEdcvmBbBb1TAb7BeVyLTweHSfTe5
Bob’s NEO address = AH6Wd2j3d6BQhSDSSyGPjDKTgii2gxHLPW
Alice’s public key =03c8cbdc902fc302329132c56a8c9535f9c86952ddf539679fc1ba29091aaaf2da
Bob’s public key = 03c075742edf955c47700586a849b453b21ee5a50129546576b673579600aef557
Alice’s shared secret (Bob’s public key + Alice’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5
Bob’s shared secret (Alice’s public key + Bob’s private key) =2e29b2afffecec017e3dd11e2061cae2a77957d9cc364cf7c837c8efc95f94d5

结果显示Alice和Bob的共享密钥是完全一致的,故称之为“共享密钥”。

现在Alice和Bob可以使用衍生的共享密钥和对称密钥算法(见维基百科:https://en.wikipedia.org/wiki/Symmetric-key_algorithm)(如高级加密标准,见维基百科:https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)来加密信息了。

使用共享密钥加密信息

信息已安全加密亟待发送,这时我们将加密信息插入到NEO交易的交易属性域中,得到的结果如下。

Alicesent QcwFUOqIaUY1heZi3eutnTMQUMy4EwrLyA== to Bob
Bob sent pZWXtZeg6-pTHlk2deInSDcL9NaVzZm-xUEUA8d__g== to Alice

在不解密的情况下,我们就无从得知Alice与Bob的对话内容,但如果没有共享密钥也就无法完成解密。

所幸Alice与Bob先前互换过公钥,因此两人对共享密钥都有访问权限,因此他们可以使用共享密钥来解密对方发送的信息。

使用共享密钥解密信息

这就是使用ECDH加/解密信息的方法。

回顾总结一下,Alice与Bob互换了公钥,因此可生成完全一致的共享密钥。共享密钥可用来加解密各自的信息。上文仅是ECDH的基本介绍,下文将讲解怎样使用ECDH为NEO区块链上的信息加密。

Bob可以给Alice发送0.00000001个GAS,并在交易属性域0x02或0x03中附上他的公钥。

鉴于Alice知道Bob的地址并且知道Bob给自己发送了一笔交易,因此应用程序应该可以从交易属性数据中获取Bob的公钥。

她的应用可以使用Bob的公钥和Alice的私钥生成一个共享密钥,使用共享密钥加密信息,再将此加密信息放入交易属性域oxfo中,同时将Alice的公钥放入oxo2中。

收到交易信息后,Bob的应用可以抓取Alice附在交易属性中的公钥与加密信息,接着开始解密。

阅读NEO网络协议文档了解交易属性域的用法。(http://docs.neo.org/en-us/node/network-protocol.html)

上述流程的示意图如下。

当然,这篇文章并不能手把手教大家开发一个NEO区块链实时通讯应用,但有助于大家了解安全通讯的概念。

信息加密还有一个伴随效应就是GAS的经济效益,GAS的最小单位就是区块链上发送加密信息所产生的费用。

希望通读本文后你能对加密货币的加密技术有更深入的了解,如果你有任何问题,请随时联系我,我的twitter账号是@imapisit,邮箱是apisit@o3.network。

感谢Andrei对本文的审校与编辑。

转载于:https://my.oschina.net/u/4005186/blog/2993610

如何在NEO区块链上实现信息加密相关推荐

  1. eos区块链 java客户端_在EOS区块链上使用EOSJS和scatter开发dApp

    由于我一直在深入研究EOS dApp的开发,我看了不少好文章.在这里,我汇总了下做一些研究后得到的所有知识.在本文中,我将解释如何使用EOSJS和scatter.我假设你对智能合约以及如何在EOS区块 ...

  2. EOS区块链上EOSJS和scatter开发dApp

    由于我一直在深入研究EOS dApp的开发,我看了不少好文章.在这里,我汇总了下做一些研究后得到的所有知识.在本文中,我将解释如何使用EOSJS和scatter.我假设你对智能合约以及如何在EOS区块 ...

  3. 王权没有永恒:暴雪错过的UGC将在区块链上爆发

    Vincent:<僵尸战场>和<Card Maker>最近一系列针对UGC(User Generated Content,用户原创内容)的动作,或将载入行业史册.UGC是游戏史 ...

  4. 行走在区块链上的智能合约

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 我和你打一个赌,我赌明天是雨天,你赌是晴天,赌注100大洋.假设明天是晴天,然后你跑过来管我要100大洋的赌金,我装疯卖 ...

  5. BCH区块链上的预言机项目——Oracles

    近日,加密开发人员cgcardona在r/btc论坛发布了一个由个人开发的BCH相关项目,项目命名为Oracles(预言),它可用于预测市场.无信任下注等,目的是为了提供一种快速引导Oracles数据 ...

  6. BCH区块链上启动新应用程序Chainfeed

    据外媒报道,比特币现金(BCH)开发人员最近推出了一个新的应用程序Chainfeed,该平台能够将所有链上数据结合起来,并进行全球实时新闻推送.此前BCH区块链上曾启动了社交媒体应用Memo和Bloc ...

  7. 在区块链上表白——使用C#将一句话放入比特币的区块链上

    最近在看区块链和比特币的知识,顺便简单研究了一下BitCoin的脚本语言,发现OP_RETURN这个命令可以在后面放入自己想说的内容,很多侧链啊,公证之类就是利用了这个特性,可以把一句话,或者一个哈希 ...

  8. 比特币区块链上最小的单位“聪” Satoshi STA 简介

    9年前,美国程序员拉斯勒-豪涅茨( LaszloHanyecz)用10000比特币买了两个披萨.去年年初,这位程序员再次使用比特币,又买了两个披萨,这次只用了649000个Satoshi. 就像传统货 ...

  9. 加密货币与智能合约的隐私 (一): 区块链上的隐私

    在本系列中,我将讨论公共区块链的隐私权衡问题:今天可以做什么和不可以做什么,为什么区块链上的隐私很重要,以及确保当今应用程序隐私的流行方法. 2009年,一个名叫Satoshi Nakamoto的人或 ...

  10. 一文读懂区块链上的隐私与监管问题

    区块链--作为公开账本,解决了各方如何建立信任的问题,却也同时带来了一个新的问题:隐私如何得到保护?当用户的所有交易信息都暴露在大众面前,如果这些交易信息被恶意挖掘及利用,将给用户隐私带来严重的威胁. ...

最新文章

  1. ORA-02291: 违反完整约束条件 - 未找到父项关键字 解决方法
  2. Visual Studio C++ 画图【极简版】
  3. 2020-11-22(树,森林和二叉树转换)
  4. android tv 开发布局,Android TV开发总结(七)构建一个TV app中的剧集列表控件
  5. 控制元素显示和隐藏的方式及区别、内容溢出处理(区域滚动)、透明性、字体图标、常见字体、自定义字体设计、网站图标、CSS代码分析
  6. 信息学奥赛C++语言: 绝对素数
  7. 31 天重构学习笔记14. 分离职责
  8. 多少秒算长镜头_你了解植保无人机一天到底能够干多少活吗??
  9. 计算机毕业论文降重,湖南计算机专业毕业论文英文摘要,财务管理专业硕士毕业论文降重...
  10. 通信系统仿真原理与无线应用笔记-MATLAB
  11. STM32+IR2104S的H桥电机驱动电路详解
  12. 深度解读设备的“万能语言”鸿蒙系统的分布式软总线能力
  13. vue子父组件之间的传值
  14. oracle同义词性能,ORACLE同义词总结 - welcome to open life - OSCHINA - 中文开源技术交流社区...
  15. 礼物:《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)
  16. ES2015简介和基本语法
  17. 企业邮箱品牌哪家好?四大品牌企业邮箱推荐
  18. 除了提升听感,鲸云音效对网易云音乐还意味着什么?
  19. 产品经理如何做好项目介绍?
  20. vmware虚拟机挂载ISO镜像并创建本地yum源

热门文章

  1. java多线程系列6-阻塞队列
  2. 微软未来五年将把80%资源投入云计算
  3. [GO]删除切片的某个值
  4. 检查oracle用户默认密码的账户
  5. 一、数据库应用系统分析及规划
  6. Exception in thread main java.lang.NoClassDefFoundError: scala/Product$class
  7. Hooks——钩子概览
  8. windows Azure平台开发
  9. linux多路径配置
  10. 原生js--类、原型、构造函数