博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node 实现 AES 加密,结果输出为“byte”。
阅读量:6082 次
发布时间:2019-06-20

本文共 2284 字,大约阅读时间需要 7 分钟。

Node 实现 AES 加密,结果输出为“byte”。

最近做个需求,对接一个平台的接口,该平台采用 AES (Advanced Encryption Standard)加密算法,加密模式为 AES-128-CBC,补码方式为 AES/CBC/PKCS5Padding,密钥和向

量均为 16 位。加密结果为 Byte 数组

用 Node 比较不好的一个地方就是,第三方接口一般都不会有 Node 的实现,所以只能自己写了。

Node 中已经提供了加密的的库 crypto ,查看官方文档 https://nodejs.org/api/crypto.html,可以找到实现这次加密需要的东西 。

crypto.createCipheriv(algorithm, key, iv)

该方法会创建一个 crypto 对象,用来加密信息。

参数 key 和 iv 是密匙和向量。
参数 algorithm 是指加密算法,也就是 OpenSSL 支持的所有 cipher 加密算法,使用以下命令列出所有算法。

openssl list-cipher-algorithms

当然了,我们这次使用的 AES-128-CBC 加密算法肯定是支持的。废话不多说,直接上代码:

/** * * @param data 加密的数据 * @param key 密匙 * @param algorithm 算法 * @param clearEncoding 明文的编码格式 * @param cipherEncoding  密文的编码格式 * @param iv  向量 * @returns {*}buffer 数组 */function encrypt(data, key, iv, algorithm) {  // 创建crypto 对象  var cipher = crypto.createCipheriv(algorithm, key, iv);  // 使用自动补码  关于补码的解释文档中也有说明  cipher.setAutoPadding(true);  var cipherChunks = [];  // 加密数据 update 方法可以执行多次。  var upate = cipher.update(new Buffer(data));  cipherChunks.push(upate);  // 结束加密  cipherChunks.push(cipher.final());  return bufferToByte(cipherChunks);}var encryptData = encrypt('要被加密的字符串', key, iv, 'AES-128-CBC');console.log('加密结果 :', encryptData);

这里有个地方需要注意 update + final 的结果才是最终结果,只取 final 的结果是不够的。

查看文档可以知道cipher 默认的输出格式是 Buffer ,Node 中的 Buffer 就是二进制串,关于Buffer的详细可以看看这篇文章

需求中要求是输出 byte 数组,但是 Node 中并没有 byte 类型,这是 Java 中才有的,其值范围是 -127~127 。既然没有,那就自己写Buffer to byte 函数 bufferToByte 吧。

/** * 将 buffer 数组转换为 byte * @param buffers * @returns {string} */function bufferToByte(buffers) {  var rt = [];  for (var i = 0; i < buffers.length; i++) {    var buffer = buffers[i];    for (var j = 0; j < buffer.length; j++) {      var c = buffer.readInt8(j);      rt.push(c);    }  }  //console.log('rt', rt);  return rt.join(' ');}

这个方法主要用到了 Buffer 提供的 readInt8 函数,意思是每次从 buffer 中读 8位二进制数,2^8 刚好是 -127 ~ 127 也就是我们要的 “byte”。

最后输出结果:

加密结果 : -18 22 105 -22 84 -106 29 -24 -23 -91 -92 -37 20 48 58 51 -34 -65 27 -106 -13 109 25 66 55 -3 -7 4 -25 113 97 6

总结:

  1. cipher 加密的完整结果是 update + final 的结果。
  2. Buffer 提供了读取二进制数的方法, readInt8 只是其中一个,详细见官方文档:https://nodejs.org/api/buffer.html#buffer_class_buffer
  3. 关于补码,这次使用了默认的 setAutoPadding 就满足了需求,如果你需要特殊的补码方式,文档里都有写~

参考:http://yijiebuyi.com/blog/13e2ae33082ac12ba4946b033be04bb5.html

转载于:https://www.cnblogs.com/myfjd/p/4656472.html

你可能感兴趣的文章
活动目录中组的类型和可用范围
查看>>
子网掩码划分随手记
查看>>
mysqli_fetch_all
查看>>
OpenCL-0-基础概念
查看>>
‘char* maxn(const char**, int)’ does not match any template declaration
查看>>
打造企业级应用--邮件服务器postfix+dovecot+extmail
查看>>
微软开发者解释为什么Windows内核落后于Linux
查看>>
HP DL380G5安装Win2012后开启Hyper-V
查看>>
信息系统项目管理师系统集成项目管理工程师相关法律法规
查看>>
标准io和管道
查看>>
微会动平台免费开放多种活动场景现场抽奖功能产品助力企业市场活动
查看>>
Project:如何分析项目中的资源分配情况
查看>>
IT男的悲惨命运(自己写的连载中)2
查看>>
SQL server网络数据库的简单应用
查看>>
OpenBSD忘记root密码恢复
查看>>
jdbc报java.lang.ClassNotFoundException: com.mysql.jdbc.Drive
查看>>
从地址栏输入url到页面显示的步骤
查看>>
iOS快速集成支付宝
查看>>
深入理解编译注解(五)RetentionPolicy.SOURCE 和 RetentionPolicy.CLASS区别讨论
查看>>
nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景
查看>>