AES(高级加密标准)是一种对称加密算法,即加密和解密使用相同的密钥。它可以加密长度为128、192和256位的数据块,并使用128位的密钥进行加密。AES算法使用了固定的块长度和密钥长度,并且被广泛应用于许多安全协议和标准中,例如SSL/TLS、SSH、IPSec等。
在AES加密中,明文被分成128位的块,每个块使用相同的密钥进行加密。加密过程包括以下步骤:
- 密钥扩展:将密钥扩展为加密算法所需的轮密钥。
- 初始轮:将明文分成块,并与第一轮密钥进行异或。
- 多轮加密:将初始轮产生的结果反复进行多轮加密,每轮使用不同的轮密钥进行加密。
- 最终轮:在最后一轮加密中,将块进行加密,但是不再进行下一轮加密,而是直接输出密文。
解密过程与加密过程类似,只是将加密过程中的步骤反过来。需要注意的是,解密的过程中使用的是相同的密钥和轮密钥。由于AES是一种块加密算法,因此在加密过程中,需要对数据进行填充,确保数据块大小为128位。
一般都需要前后端配置的加解密方式类型都一致,示例如下,具体情况需要和后端进行协调,此处我是使用Hutool的 SecureUtil.aes("0123456789ABCDEF".getBytes());
来进行加解密的,使用的AES默认配置,所以前端需要使用如下配置才可以正常和后端同步加解密
// 例如引入一个CryptoJS来使用AES
<script src="https://cdn.staticfile.org/crypto-js/4.0.0/crypto-js.min.js"></script>
<script>
// 定义密文和密钥
const ciphertext = 'qZief4Y7nr5O2yK5cQxf9z1C5S7g16AP9fNHrHCeNBM='; // 要解密的密文
const key = '0123456789ABCDEF'; // 密钥
// 获取密钥对应的byte数组
const keyBytes = CryptoJS.enc.Utf8.parse(key);
// 解密操作
const decryptedBytes = CryptoJS.AES.decrypt(ciphertext, keyBytes, {
mode: CryptoJS.mode.ECB,// 设置成与后端一致的加解密模式
padding: CryptoJS.pad.Pkcs7// 设置成与后端一致的填充方式
});
const decryptedText = decryptedBytes.toString(CryptoJS.enc.Utf8);
// 输出解密结果
console.log(decryptedText)
</script>