【js】crypto-jsDES加密解密

我的应用场景后端对接口数据进行 DES 加密,前端需要解密,前后端需统一 key 值,加密方式,填充方式以及返回数据编码(我这是 base64);于是使用到了 crypto-js 库,使用这个库时候。需要将数据转换成它内部的数据类型 wordArray,解密出来的数据也是 wordArray 需要转换,crypto-js 库内部提供转换方法。
加密的数据:

安装 crypto-js

1
npm install crypto-js

DES 加密解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import CryptoJS from "crypto-js";

// 约定的密钥 DES 一般 64 位(8 个字节),AES 一般 128 位(16 字节)、192 位(24 字节)、256 位(32 字节)
const key = CryptoJS.enc.Utf8.parse("2f4a0f6166b8d404");
// 以下使用的是 CBC 模式(ECB 模式不需要 IV,但不推荐使用)大小为加密块的大小,这里是 64 位(8 个字节)
// 加密块补充: DES 加密块大小为 64 位(8 个字节) AES 加密块大小为 128 位(16 个字节)
const iv = CryptoJS.lib.WordArray.random(8);

/**
* DES 加密
* @param {String} message
* @returns {String}
*/
function encryptByDES(message) {
const encrypted = CryptoJS.DES.encrypt(message, key, {
// 约定的方式与填充
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv,
});
// 返回约定的编码数据(base64)
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}

/**
* DES 解密
* @param {String} ciphertext
* @returns {String}
*/
function decryptByDES(ciphertext) {
const cipherParams = CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Base64.parse(ciphertext),
});
const decrypted = CryptoJS.DES.decrypt(cipherParams, key, {
// 约定的方式与填充
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv,
});
return decrypted.toString(CryptoJS.enc.Utf8);
}