使用CryptoJS 对AES 进行加密解密,正常博主都会说具体怎么做,怎么用,那么我这边来写点不一样的,实际在加密解密过程中遇到的问题--当我们遇到密钥长度不够128位既16位时如何处理
import str2ab from 'string-to-arraybuffer'
import ab2str from 'arraybuffer-to-string'
//设置密钥长度
const initKey = 'abc123';
// 设置数据块长度
const keySize = 128;
/**
* 定义解密函数
* @param {string} encrypted - 加密的数据;
* @param {string} key - 加密使用的 key
*/
const aesDecrypt = (encrypted, key) => {
// 返回的是一个解密后的对象
const obj = CryptoJS.enc.Hex.parse(encrypted);
const srcs = CryptoJS.enc.Base64.stringify(obj);
const decipher = CryptoJS.AES.decrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
// 将解密对象转换成 UTF8 的字符串
const resultDecipher = CryptoJS.enc.Utf8.stringify(decipher);
// 返回解密结果
return resultDecipher;
}
// 获取填充后的key
const key = CryptoJS.enc.Utf8.parse(fillKey(initKey));
/**
* 生成密钥字节数组, 原始密钥字符串不足128位, 补填0.
* @param {string} key - 原始 key 值
* @return Buffer
*/
const fillKey = (key) => {
const filledKey = new ArrayBuffer(keySize / 8);
const keys = str2ab(key);
const filledKeyView = new Uint8Array(filledKey);
const keysView = new Uint8Array(keys);
if (keys.byteLength < filledKey.byteLength) {
for (var i = 0; i < keys.byteLength; i++) {
filledKeyView[i] = keysView[i]
}
}
return ab2str(filledKey,'utf8');
}
具体思路方式为:
1.生成一个128/8的 空 arraybuffer
2.将key转为 arraybuffer
3.将key 生成的 arraybuffer 按位赋值给 空arraybuffer
4.赋值后的arraybufer转为 str 做密钥使用