安装
npm install crypro-js
使用
可以使用ES6的import
语法,或者node.js的require语法
AES对称加密
// 引入
const cryptoJS = require('crypto-js')
const AES = require('crypto-js/aes')
// 测试对象
const user = {
name: 'lonzo',
age: 23,
password: 'qwert12345'
}
// 加密解密的密钥
const secretKey = 'qdwqnwq123411kd'
// 加密,JSON序列化要加密的对象
let ciphertext = AES.encrypt(JSON.stringify(user), secretKey).toString()
// 解密
let originaltext = AES.decrypt(ciphertext, secretKey).toString(cryptoJS.enc.Utf8)
console.log('加密前' + JSON.stringify(user))
console.log('加密后' + ciphertext)
console.log('解密后' + originaltext)
密钥
密钥是AES加密、解密的根本,需要使用同一个密钥
AES支持三种长度的密钥
- AES128(性能最好)
- AES192
- AES256(安全性最高)
填充
为什么需要填充?
由于AES算法在对明文加密的时候,并不是把整个明文一次性加密成一段密文,而是将明文拆分成一个个独立的明文块,每一个明文块的长度128bit;
这些明文块经过AES加密处理生成一个个独立的密文块,这些密文块拼接在一起就是AES加密后的密文;
由于明文块的长度是按128bit来拆分的,所以当明文长度不是128的整数倍
时,就会有长度不足128bit的明文块,这个时候就需要对其进行填充
(padding)
填充有哪几种方式
- NoPadding:不做任何填充,但是要求明文必须是16字节(128bit)的整数倍
PKCS5Padding(默认):如果明文块少于16字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数
明文: {1,2,3,4,5,a,b,c,d,e} 缺少6个字节
=>PKCS5Padding补全后 {1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,
最后一个字符值等于缺少的字符数,其他字符填充随机数
明文: {1,2,3,4,5,a,b,c,d,e} 缺少6个字节
=>ISO10216Padding补全后 {1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
模式
AES的工作模式,体现在加密过程中
CBC 电码本模式
- ECB 密码分组链接模式(默认)
- CTR 计算器模式
- CFB 密码反馈模式
- OFB 输出反馈模式