纯 JavaScript 实现 AES 加密
如果你既不想使用 crypto.subtle
也不愿意使用第三方库,那么你需要自己编写加密和解密的逻辑。这通常涉及使用纯 JavaScript 实现加密算法。虽然这种方法不如使用标准库或第三方库安全和高效,但对于简单的场景可能足够使用。
使用纯 JavaScript 实现 AES 加密
AES 加密算法相对复杂,但我们可以尝试使用一些纯 JavaScript 的方法来实现一个简单的加密和解密逻辑。这里我们将使用一个简化的版本,仅使用 XOR 操作来模拟加密和解密过程。请注意,这种方法并不安全,仅供学习和测试使用。
示例代码
生成随机密钥
首先,我们需要生成一个随机的密钥。这里我们可以使用 Math.random()
来生成一个伪随机数,并将其转换为字符串形式。
function generateRandomKey(length) {
let key = '';
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let i = 0; i < length; i++) {
key += possible.charAt(Math.floor(Math.random() * possible.length));
}
return key;
}
加密函数
接下来,我们实现一个简单的加密函数。这里我们将使用 XOR 操作来加密数据。
function encrypt(key, data) {
let encrypted = '';
for (let i = 0; i < data.length; i++) {
const charCode = data.charCodeAt(i) ^ key.charCodeAt(i % key.length);
encrypted += String.fromCharCode(charCode);
}
return btoa(encrypted); // 将加密后的字符串转换为 Base64 编码
}
解密函数
接着,我们实现一个解密函数,它使用相同的密钥和 XOR 操作来解密数据。
function decrypt(key, encryptedData) {
const decryptedData = atob(encryptedData); // 将 Base64 编码的字符串转换回来
let decrypted = '';
for (let i = 0; i < decryptedData.length; i++) {
const charCode = decryptedData.charCodeAt(i) ^ key.charCodeAt(i % key.length);
decrypted += String.fromCharCode(charCode);
}
return decrypted;
}
示例使用
现在我们可以使用这些函数来加密和解密数据:
(() => {
try {
const key = generateRandomKey(16); // 生成 16 字节(128 位)的密钥
const originalText = 'Hello, world!';
const encryptedText = encrypt(key, originalText);
console.log('Encrypted:', encryptedText);
const decryptedText = decrypt(key, encryptedText);
console.log('Decrypted:', decryptedText);
} catch (error) {
console.error('Error:', error);
}
})();
详细解释
-
生成随机密钥:
- 使用
Math.random()
生成一个随机的字符串作为密钥。这里生成的是一个长度为 16 的字符串,适合 128 位的 AES 密钥长度。
- 使用
-
加密函数:
- 使用 XOR 操作逐字符加密数据。密钥会循环使用,直到加密完整个字符串。
- 最后将加密后的字符串转换为 Base64 编码,以便更容易地存储和传输。
-
解密函数:
- 使用相同的密钥和 XOR 操作逐字符解密数据。
- 先将 Base64 编码的字符串转换回原始字符串,然后再进行解密。
注意事项
- 安全性:这种方法非常基础,并不具备真正的安全性。XOR 操作很容易被破解,尤其是在密钥重复使用的情况下。对于生产环境,强烈建议使用标准的加密库和算法。
- 密钥管理:密钥应该妥善保存,并且在传输过程中应该加密。
- 初始化向量(IV) :在实际应用中,通常还需要使用初始化向量(IV)来增加加密的安全性。IV 应该是随机生成的,并且与密文一起存储。
总结
通过使用纯 JavaScript 实现简单的 XOR 操作,你可以实现一个基本的加密和解密逻辑。然而,这种方法并不适合生产环境,因为它缺乏安全性。对于生产环境中的加密需求,建议使用标准的加密库和算法,如 Web Crypto API
或第三方库(如 CryptoJS)。
