纯 JavaScript 实现 AES 加密

纯 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);
  }
})();

详细解释

  1. 生成随机密钥

    • 使用 Math.random()​ 生成一个随机的字符串作为密钥。这里生成的是一个长度为 16 的字符串,适合 128 位的 AES 密钥长度。
  2. 加密函数

    • 使用 XOR 操作逐字符加密数据。密钥会循环使用,直到加密完整个字符串。
    • 最后将加密后的字符串转换为 Base64 编码,以便更容易地存储和传输。
  3. 解密函数

    • 使用相同的密钥和 XOR 操作逐字符解密数据。
    • 先将 Base64 编码的字符串转换回原始字符串,然后再进行解密。

注意事项

  • 安全性:这种方法非常基础,并不具备真正的安全性。XOR 操作很容易被破解,尤其是在密钥重复使用的情况下。对于生产环境,强烈建议使用标准的加密库和算法。
  • 密钥管理:密钥应该妥善保存,并且在传输过程中应该加密。
  • 初始化向量(IV) :在实际应用中,通常还需要使用初始化向量(IV)来增加加密的安全性。IV 应该是随机生成的,并且与密文一起存储。

总结

通过使用纯 JavaScript 实现简单的 XOR 操作,你可以实现一个基本的加密和解密逻辑。然而,这种方法并不适合生产环境,因为它缺乏安全性。对于生产环境中的加密需求,建议使用标准的加密库和算法,如 Web Crypto API​ 或第三方库(如 CryptoJS)。

image.png

留下你的脚步
推荐阅读