文章目录
- 引入
- 加密
- 解密
引入
CryptoJS 是一个流行的 JavaScript 库,用于加密和解密数据。以下是如何使用 CryptoJS 来解密 AES 加密的数据:
首先,确保你已经在项目中包含了 CryptoJS 库。你可以通过 npm 安装它:
npm install crypto-js
然后,在你的 JavaScript 文件中引入它:
const CryptoJS = require("crypto-js");
或者,如果你直接在 HTML 中使用,可以通过 CDN 引入:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
加密
接下来,你可以使用以下代码来解密 AES 加密的数据:
- 加密模式
- AES 解密模式:CFB 模式
- 填充方式:nopadding
- 输入格式:string
- 输出格式:base64
const CryptoJS = require("crypto-js");
function encryptAES(plaintext, secretKey, iv) {
const secretKeyHex = CryptoJS.enc.Utf8.parse(secretKey); // 将密钥转换为 WordArray
const ivHex = CryptoJS.enc.Utf8.parse(iv); // 将 IV 转换为 WordArray
const plaintextWordArray = CryptoJS.enc.Utf8.parse(plaintext); // 将明文转换为 WordArray
const encrypted = CryptoJS.AES.encrypt(plaintextWordArray, secretKeyHex, {
iv: ivHex,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding // 使用 nopadding
});
const ciphertextBase64 = encrypted.toString(CryptoJS.enc.Base64); // 将加密后的 CipherParams 对象转换为 Base64 字符串
return ciphertextBase64;
}
// 示例用法
const plaintext = "要加密的明文"; // 替换为实际的明文
const secretKey = "1234567812345678"; // 密钥,16字节
const iv = "1234567812345678"; // 初始化向量,16字节
const ciphertextBase64 = encryptAES(plaintext, secretKey, iv);
console.log(ciphertextBase64); // 输出加密后的 Base64 字符串
请注意以下几点:
- CryptoJS.enc.Utf8.parse 用于将明文、密钥和 IV 从 UTF-8 字符串转换为 WordArray。
- CryptoJS.AES.encrypt 方法用于执行 AES 加密。它接受三个参数:要加密的明文(WordArray)、密钥(WordArray)和一个配置对象。
- 在配置对象中,我们指定了 mode: CryptoJS.mode.CFB 来使用 CFB 模式,并且指定了 padding: CryptoJS.pad.NoPadding 来使用 nopadding 填充方式。我们还通过 iv 属性设置了 IV。
- 加密后的结果是一个 CipherParams 对象,我们使用 toString(CryptoJS.enc.Base64) 方法将其转换为 Base64 编码的字符串。
确保替换 plaintext 变量的值为实际的明文。同时,确保密钥和 IV 与你计划用于解密的密钥和 IV 相同。如果加密和解密过程中有任何不匹配,解密将会失败。
解密
- 解密模式
- AES 解密模式:CFB 模式
- 填充方式:nopadding
- 输入格式:base64
- 输出格式:string
const CryptoJS = require("crypto-js");
function decryptAES(ciphertextBase64, secretKey, iv) {
const secretKeyHex = CryptoJS.enc.Utf8.parse(secretKey); // 将密钥转换为 WordArray
const ivHex = CryptoJS.enc.Utf8.parse(iv); // 将 IV 转换为 WordArray
const ciphertext = CryptoJS.enc.Base64.parse(ciphertextBase64); // 将 Base64 编码的密文转换为 WordArray
const decrypted = CryptoJS.AES.decrypt({
ciphertext: ciphertext
}, secretKeyHex, {
iv: ivHex,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding // 使用 nopadding
});
const decryptedText = decrypted.toString(CryptoJS.enc.Utf8); // 将解密后的 WordArray 转换为 UTF-8 字符串
return decryptedText;
}
// 示例用法
const ciphertextBase64 = "你的Base64编码的AES加密文本"; // 替换为实际的 Base64 编码的密文
const secretKey = "1234567812345678"; // 密钥,16字节,与加密时使用的密钥相同
const iv = "1234567812345678"; // 初始化向量,16字节,与加密时使用的IV相同
const decryptedText = decryptAES(ciphertextBase64, secretKey, iv);
console.log(decryptedText); // 输出解密后的文本
请注意以下几点:
- CryptoJS.enc.Utf8.parse 用于将密钥和 IV 从 UTF-8 字符串转换为 WordArray。
- CryptoJS.enc.Base64.parse 用于将 Base64 编码的密文转换为 WordArray。
- CryptoJS.AES.decrypt 方法的第二个参数是密钥的 WordArray,第三个参数是一个配置对象,其中包含模式(mode)、填充(padding)和 IV(iv)。
- 在配置对象中,我们指定了 mode: CryptoJS.mode.CFB 来使用 CFB 模式,并且指定了 padding: CryptoJS.pad.NoPadding 来使用 nopadding 填充方式。
- 最后,使用 toString(CryptoJS.enc.Utf8) 将解密后的 WordArray 转换为 UTF-8 字符串。
确保替换 ciphertextBase64 变量的值为实际的 Base64 编码的 AES 加密文本。同时,确保密钥和 IV 与加密时使用的完全相同。如果加密和解密过程中有任何不匹配,解密将会失败。