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的详细可以看看这篇文章 深入浅出Node.js(六):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

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

  1. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  2. java nodejs aes_Java与Node.js利用AES加密解密出相同结果的方法示例

    前言 工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下 ...

  3. python aes padding_使用PKCS7Padding在python和Node.js之间进行AES加密

    已解决 密码学Python 使用PKCS7Padding在python和Node.js之间进行AES加密10 我试图用Node.js中的pkcs7填充来解密消息没有成功. 此消息已加密并从Python ...

  4. android、ios、php之间AES加密解密

    使用原因: 因为在项目中,需要在与客户端(IOS,Android)交互的时候,保存一些私有信息,不被别人看到,所以,使用了比较流行的可以反向加解密的AES. PHP 源码 <?php$aes = ...

  5. AES加密解密算法Java实现

    AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  6. openssl与cryptoAPI交互AES加密解密

    原文: http://blog.csdn.net/zhouyuqwert/article/details/7422467 有读者指出代码贴两遍,修改下. 继上次只有CryptoAPI的加密后,这次要实 ...

  7. AES加密 — 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120285594 本文出自[赵彦军的博客] 文章目录 推荐 AES 简介 对称加密 ...

  8. DES加密解密与AES加密解密

    × 目录 [1]AES加密算法和DES加密算法的效率比较 [2]AES和DES加密解密代码 随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了 ...

  9. php aes加密解密_JAVA实现PHP的openssl_encrypt方法

    导读:本文主要讨论如何通过 Java 方式实现 PHP 的 openssl_encrypt() 加密方法与 openssl_decrypt() 解密方法.本文例子加解密例子均采用 AES256 位 c ...

最新文章

  1. 将博客搬至51CTO
  2. linux输入ls命令报错,Linux命令基础2-ls命令
  3. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数
  4. Spark Stream整合flum和kafka,数据存储在HBASE上,分析后存入数据库
  5. mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
  6. 知乎的 Flink 数据集成平台建设实践
  7. VUE 数据绑定模块渲染 computed(实现通过路由id 查询数据json结构,对应的值来放在面包屑中)...
  8. auto static 的区别
  9. Leetcode811.Subdomain Visit Count子域名访问计数
  10. layer弹出相册层
  11. PHP-redis中文帮助手册_set相关
  12. SharePoint Online 自定义Modern UI表单
  13. Android应用分类
  14. 怎样将图片制作转换圆形图片
  15. android系统的刷机步骤,安卓系统刷机教程的操作
  16. 高线测径仪精密测量已实现全面的检测
  17. DirextX9之2D编程 通过16位色位图创建背景透明的纹理
  18. 语音识别学习记录 [kaldi中的openfst]
  19. C语言鼠标病毒,鼠标也中毒Windows系统中鼠标乱动是否中了病毒
  20. java动物类问题_java实现动物特性的面向对象的描述(三个阶段)

热门文章

  1. 打球崴脚,运动崴脚怎么办?这里有一份最强处置指南
  2. 微商分销代理商城源码-代理等级和升级条件
  3. 一个比较不错的swapidc模板源码
  4. 面试:一文搞懂Java集合
  5. 腾讯QQ空间g_tk算法
  6. jquery 自动完成 Autocomplete
  7. input 关闭输入法
  8. go标准库:time
  9. 常用控件 winform
  10. 字节流读数据 一次读一个字节