图说区块链之加解密技术

让区块链回归

技术与应用的本质

(漫画: Hugh@链ke版权转载请联系小编)

趣味

实践

场景

男生Bob想向他的媳妇儿Alice表达埋藏已久的心声“I love you!”,但碍于男人的颜面,不好意思当面说出口,只好加密传输。这里基于一个可行的假设,就是他们已经拥有彼此的公钥,或者可以简单获得。

需求

加密:不能让别人看到信息;

解密:媳妇可以恢复并查看;

签名:Bob可以签名信息,确保不被篡改;

认证:媳妇收到信息,可以验明正身,确认是Bob所发,而不是别人的恶作剧。

方案

加密与解密技术:技术上,最好使用NaCl,其次是libsodium(背后仍是NaCl),但是搜索了一下github,Node.js社区还没有相关NaCl稳定的封装包,libsodium倒是有一个Natrium。因此,只能选择使用Crypto简单加密和解密。

签名与验证技术:当然最好的选择是了。

编码

新建一个简单的Node.js工程

(1)生成密钥对

Bob没有使用随机字符串,而是使用一个密码,并采取SHA256算法生成密钥对。

var crypto = require('crypto');var ed25519 = require('ed25519');var bobsPassword = 'This is my password, you don`t guess it!';var hash = crypto.createHash('sha256').update(bobsPassword).digest();var bobKeypair = ed25519.MakeKeypair(hash);

(2)给信息加密和签名

通常是先加密后签名。

这里使用Crypto给信息进行了简单加密,把Bob的公钥作为加密键值(但是既然是公钥,谁会不知道呢,除非Bob只把公钥给了Alice),可能还得Bob告诉他媳妇儿Alice使用什么算法来解密。

var message = 'Hi Alice, I love you!';var msgCiphered = cipher('aes192', bobKeypair.publicKey, message); //公钥进行加密,如果是Natrium,这里就是私钥加密var signature = ed25519.Sign(new Buffer(msgCiphered, 'utf8'), bobKeypair.privateKey); //私钥进行签名

(3)给Alice发送签名信息

这个就各显神通了。

(4)Alice验证并解密

通常是先验证后解密。

if (ed25519.Verify(new Buffer(msgCiphered, 'utf8'), signature, bobKeypair.publicKey)) { // 验证函数返回了true,通过验证 var msg = decipher('aes192', bobKeypair.publicKey, msgCiphered); //使用Bob的公钥解密 console.log('签名合法,信息来自Bob!'); console.log('Bob said: ', msg); //显示信息} else { // 验证函数返回了false,肯定不是Bob的信息. console.log('签名不合法!');}

(5)补充代码

上面用到的Crypto的加密解密方法:

//解密function (algorithm, key, buffer){ var encrypted = ""; var cip = crypto.createCipher(algorithm, key); encrypted += cip.update(buffer, 'utf8', 'hex'); encrypted += cip.final('hex'); return encrypted;}//解密function decipher(algorithm, key, encrypted){ var decrypted = ""; var decipher = crypto.createDecipher(algorithm, key); decrypted += decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}

(6)运行实例

使用下面的命令,可以运行上述代码:

$ git clone https://github.com/imfly/node.js-practice$ cd node.js-practice$ npm install$ node crypto/

输出结果:

签名合法,信息来自Bob!Bob said: Hi Alice, I love you!

ke

优质区块链社区

技术干货

框架原理

区块链+

价值应用

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180515G19WFB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励