最近改写 uniapp 时候用到了 3des 加密解密,网上找了好多资料好多写的都是 des 加解密,3des和des 是有区别的
DES:Data Encryption Standard(数据加密标准,又美国国密局,选中的IBM的方案,密钥长度为56,标准提出是要使用64位长的密钥,但是实际中DES算法只用了64位中的56位密钥,这一点是容易出错的)
3DES:trip DES(3级DES,是DES的升级版,主要是为了应对快速发展的计算机能力,能够在24小时内暴力破解传统的56位长度密钥的DES,而3DES相当于对统一数据块采用3次DES,3次DES使用的密钥如果完全不同,则密钥长度可以达到168位,大大延长了被暴力破解的时间)
1. 安装加密库
npm install crypto-js --save-dev
或者手动导入工程里加密文件
2. 引入加密库
import CryptoJS from 'crypto-js'
3. 加密
注意加密方法是【TripleDES】不是【DES】
let keyHex = CryptoJS.enc.Utf8.parse('uniapp-cryptojs-tripledes')
var encrypted = CryptoJS.TripleDES.encrypt ('123456890', keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
// 偏移量
// iv: CryptoJS.enc.Utf8.parse(ivstr)
});
console.log('加密字符串Base64', encrypted.toString());
console.log('加密字符串', encrypted.ciphertext.toString());
- 【encrypted.toString】输出是 Base64 加密结果
- 【encrypted.ciphertext.toString】输出的是十六进制的加密结果
4. 解密
let keyHex = CryptoJS.enc.Utf8.parse('uniapp-cryptojs-tripledes')
let decryted = CryptoJS.TripleDES.decrypt ( {
ciphertext: CryptoJS.enc.Base64.parse(base64)
}, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
// 偏移量
// iv: CryptoJS.enc.Utf8.parse(ivstr)
});
console.log('解密字符串',decryted.toString(CryptoJS.enc.Utf8));
解密只支持 Base64 解密方式,如果是16进制的字符串,需要把16进制转换成base64 再解密。
//第一步把16进制字符串转为WordArray格式
const WordArray = CryptoJS.enc.Hex.parse(ciphertext);
//第二步把WordArray再转为base64的字符串
const base64str = CryptoJS.enc.Base64.stringify(WordArray);
// 使用 base64str 进行上面的解密操作
5. 测试验证
好多人写完不知道加密的是否正确,下面提供一个 3des 加密例子
加密Key :uniapp-cryptojs-tripledes
原字符串:123456890
Base64加密字符串:WmrGowJCtUQd/2PgoyrJuQ==
16进制加密字符串:5a6ac6a30242b5441dff63e0a32ac9b9
反之,解密后能获取原字符串,即成功了。
================ 排雷 ================
如果你加密是下面的结果,那么就是加密方式错了,注意使用【CryptoJS.TripleDES】而不是【CryptoJS.DES】
使用DES加密方式的结果
加密Key :uniapp-cryptojs-tripledes
原字符串:123456890
Base64加密字符串:j+MUYRccCbBfTqUIPZdtpQ==
16进制加密字符串:8fe31461171c09b05f4ea5083d976da5