使用 Crypto.js 实现 AES 加密解密

Web

新的需求,前后端通信需要将数据加密后再传输,敲定了使用 AES。

安装:

1
2
npm install crypto-js
npm install --save @types/crypto-js

参数:

1.AES加密算法,ECB & CBC。

2.32位秘钥key(通过给定秘钥取md5值获得),”123456”。

3.16位初始向量iv,秘钥key的md5值前16位。

4.加密数据,”123456789”。

事例:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
var CryptoJS = require("crypto-js");

// 辅助函数
function md5(data) {
return CryptoJS.MD5(data).toString();
}

// 传入key之前要调用,不然结果不对
function parseKey(key) {
return CryptoJS.enc.Utf8.parse(key);
}

// 加密过程
function encrypt(mode, plainText, key, iv = null) {
const uKey = parseKey(key);
const uIv = parseKey(iv);
return CryptoJS.AES.encrypt(plainText, uKey,
{
iv: uIv,
mode: mode,
padding: CryptoJS.pad.Pkcs7
}
).toString();
}

// 解密过程
function decrypt(mode, cipherText, key, iv = null) {
const uKey = parseKey(key);
const uIv = parseKey(iv);
let bytes = CryptoJS.AES.decrypt(cipherText, uKey,
{
iv: uIv,
mode: mode,
padding: CryptoJS.pad.Pkcs7
}
);
return bytes.toString(CryptoJS.enc.Utf8);
}

function toAES() {
const key = '123456';
const md5Key = md5(key);
const iv = md5Key.substr(0, 16);
const data = '123456789';

// ECB 模式
let cipherText = encrypt(CryptoJS.mode.ECB, data, md5Key);
console.log(cipherText);
// 7J0VfbEYF0XdLnLuA1b4Fw==

let plainText = decrypt(CryptoJS.mode.ECB, cipherText, md5Key);
console.log(plainText);

// CBC 模式
cipherText = encrypt(CryptoJS.mode.CBC, data, md5Key, iv);
console.log(cipherText);
// sfH6iGxc01TkIaOUN77hQQ==

plainText = decrypt(CryptoJS.mode.CBC, cipherText, md5Key, iv);
console.log(plainText);
}

toAES();

本文作者:Kiro

本文链接: https://www.kiro.cc/2022/06/crypto-js/