跳至主要内容

AES 加密和解密

此示例演示了使用 Deno 内置的 SubtleCrypto API 进行 AES 加密和解密。

在 Github 上编辑
定义要加密的文本
const text = "Hello, Deno 2.0!";
使用 TextEncoder 将文本转换为 Uint8Array(加密需要)
const encoder = new TextEncoder();
const data = encoder.encode(text);
为加密和解密生成 AES-GCM 密钥 我们在此示例中使用 AES-GCM,因为它是一种广泛使用的加密模式,但您也可以使用 AES-CBC 或 AES-CTR 等模式来满足不同的用例。
const key = await crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256, // 256-bit encryption key for strong security
  },
  true, // The key is extractable for encryption and decryption
  ["encrypt", "decrypt"], // Key usages: encryption and decryption
);
为 AES-GCM 生成随机的初始化向量(IV) 每个加密操作的 IV 必须是唯一的,但不需要保密。
const iv = crypto.getRandomValues(new Uint8Array(12)); // 12-byte IV for AES-GCM
使用 AES-GCM 加密文本
const encryptedData = await crypto.subtle.encrypt(
  {
    name: "AES-GCM",
    iv: iv, // Initialization vector must be unique for each encryption
  },
  key, // The generated key
  data, // The text data to encrypt
);

console.log("Encrypted Data:", new Uint8Array(encryptedData)); // Log the encrypted result as a byte array
使用相同的 IV 和密钥将加密数据解密回明文。用于解密的 IV 和密钥必须与用于加密的 IV 和密钥相同
const decryptedData = await crypto.subtle.decrypt(
  {
    name: "AES-GCM",
    iv: iv, // Same IV used for encryption
  },
  key, // The same key used for encryption
  encryptedData, // The encrypted data to decrypt
);
使用 TextDecoder 将解密后的数据转换回字符串
const decryptedText = new TextDecoder().decode(decryptedData);
console.log("Decrypted Text:", decryptedText);

使用 Deno CLI 在本地运行 此示例

deno run https://docs.deno.org.cn/examples/aes-encryption.ts