博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用
阅读量:4073 次
发布时间:2019-05-25

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

转载:http://yijiebuyi.com/blog/13e2ae33082ac12ba4946b033be04bb5.html

关于什么是AES? 需要自己goole了解一下,今天就是简单和大家分享node.js下使用 AES/ECB/PKCS5Padding 如何与其他语言通用加密解密.

就像你的接口是node.js提供服务,而第三方平台是其他端语言开发,比如php ,在第三方平台请求你的接口可能需要sign验证,假设我们使用了AES/ECB/PKCS5Padding  加密.

AES/ECB/PKCS5Padding  斜线分隔的3部分分别是 算法/模式/填充量

AES加密包括不同的模式,已经后面是否有填充量(为什么有填充量,就像我们引用的图片,一个AES块是16个字节,如果不满16的时候要不要填充?)

算法/模式/填充                16字节加密后长度        不满16字节加密后长度

AES/CBC/NoPadding             16                                  不支持

AES/CBC/PKCS5Padding          32                                  16

AES/CBC/ISO10126Padding       32                              16

AES/CFB/NoPadding             16                              原始数据长度

AES/CFB/PKCS5Padding          32                                  16

AES/CFB/ISO10126Padding       32                              16

AES/ECB/NoPadding             16                                  不支持

AES/ECB/PKCS5Padding          32                              16

AES/ECB/ISO10126Padding       32                              16

AES/OFB/NoPadding             16                              原始长度

AES/OFB/PKCS5Padding          32                              16

AES/OFB/ISO10126Padding       32                              16

AES/PCBC/NoPadding            16                              不支持

AES/PCBC/PKCS5Padding         32                              16

AES/PCBC/ISO10126Padding      32                          16

看上面的列表可以知道aes加密后要么16要么32位(前提是大于16字节)

有先模式是不支持对于不满16字节字符串的加密,见上面列表最后一列 (不支持)

如果不满16字节且支持加密的模式,一定是有填充量的,就是不满16的字节用一个默认值来填充,直到它满16位后再加密.

这个填充量你可以指定,大部分语言默认有一种缺省补充量,但是node.js是没有的,就是说当你不足16位时,自己又没有指定填充量,那么node.js语言本身默认不补全填充量.

AES/ECB/PKCS5Padding,我们用这个模式来说一下.

node.js自带加密解密模块 

var crypto = require('crypto');

可以看出此模块暴露了很多方法(下面还有一部分未被截图的)

如果你已经google找了半天关于node.js aes加密和其他语言不通用的时候.

第一检查你是不是用了下面的加密函数.

createCipher 函数不支持填充量,你需要的是 createCipheriv

直观的你可以看到多了一个 iv ,没错,这个方法与上一个不同的就是支持填充量 iv

直接见下面代码:

//data 是准备加密的字符串,key是你的密钥function encryption(data, key) {    var iv = "";    var clearEncoding = 'utf8';    var cipherEncoding = 'base64';    var cipherChunks = [];    var cipher = crypto.createCipheriv('-128-ecb', key, iv);    cipher.setAutoPadding(true);    cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));    cipherChunks.push(cipher.final(cipherEncoding));    return cipherChunks.join('');}//data 是你的准备解密的字符串,key是你的密钥function decryption(data, key) {    var iv = "";    var clearEncoding = 'utf8';    var cipherEncoding = 'base64';    var cipherChunks = [];    var decipher = crypto.createDecipheriv('-128-ecb', key, iv);    decipher.setAutoPadding(true);    cipherChunks.push(decipher.update(data, cipherEncoding, clearEncoding));    cipherChunks.push(decipher.final(clearEncoding));    return cipherChunks.join('');}

上面的加密,解密函数 createCipheriv ,createDecipheriv 支持3个参数,最后一个参数iv就是填充量,我们使用了空字符串.

这样后和其他语言此模式下的加密串一直,相互解密也是没有问题的.

给文件AES加密,以及base64字符串转化为文件

//传文件路径和  key, 返回加密base64字符串.function encryption_file(file_path, key) {    var iv = "";    var clearEncoding = 'binary';    var cipherEncoding = 'base64';    var cipherChunks = [];    var cipher = crypto.createCipheriv('-128-ecb', key, iv);    cipher.setAutoPadding(true);    var buf = fs.readFileSync(file_path);    cipherChunks.push(cipher.update(buf, clearEncoding, cipherEncoding));    cipherChunks.push(cipher.final(cipherEncoding));    return cipherChunks.join('');}//传base64串和加密key ,返回直接数组,将字节数组转化为文件保存即可function decryption_file(file_base64, key) {    var iv = "";    var clearEncoding = 'binary';    var cipherEncoding = 'base64';    var cipherChunks = [];    var cipher = crypto.createCipheriv('-128-ecb', key, iv);    cipher.setAutoPadding(true);    cipherChunks.push(cipher.update(file_base64, cipherEncoding,clearEncoding));    cipherChunks.push(cipher.final(clearEncoding));    return cipherChunks;}

你可能感兴趣的文章
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>
memcached工作原理与优化建议
查看>>
Redis与Memcached的区别
查看>>
redis sharding方案
查看>>
程序员最核心的竞争力是什么?
查看>>
Node.js机制及原理理解初步
查看>>
linux CPU个数查看
查看>>
分布式应用开发相关的面试题收集
查看>>
简单理解Socket及TCP/IP、Http、Socket的区别
查看>>
利用HTTP Cache来优化网站
查看>>
利用负载均衡优化和加速HTTP应用
查看>>
消息队列设计精要
查看>>
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>