js实现gcm加密
GCM 加密简介
GCM(Galois/Counter Mode)是一种提供加密和认证的加密模式,常用于需要高性能和安全性的场景。JavaScript 中可以通过 Web Crypto API 实现 GCM 加密。
生成密钥
使用 crypto.subtle.generateKey 方法生成 AES-GCM 密钥。密钥长度可以是 128、192 或 256 位。

const generateKey = async () => {
return await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"]
);
};
加密数据
使用 crypto.subtle.encrypt 方法进行加密。需要提供初始化向量(IV)和可选的附加认证数据(AAD)。

const encryptData = async (key, data, iv) => {
return await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv,
additionalData: new TextEncoder().encode("optional-aad"),
tagLength: 128,
},
key,
new TextEncoder().encode(data)
);
};
解密数据
使用 crypto.subtle.decrypt 方法进行解密。需要提供相同的 IV 和 AAD。
const decryptData = async (key, encryptedData, iv) => {
return await crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: iv,
additionalData: new TextEncoder().encode("optional-aad"),
tagLength: 128,
},
key,
encryptedData
);
};
完整示例
以下是一个完整的示例,展示如何生成密钥、加密和解密数据。
const runExample = async () => {
const key = await generateKey();
const iv = crypto.getRandomValues(new Uint8Array(12));
const data = "Hello, GCM!";
const encryptedData = await encryptData(key, data, iv);
console.log("Encrypted:", new Uint8Array(encryptedData));
const decryptedData = await decryptData(key, encryptedData, iv);
console.log("Decrypted:", new TextDecoder().decode(decryptedData));
};
runExample();
注意事项
- IV 必须是唯一的,每次加密都应使用不同的 IV。IV 不需要保密,可以随密文一起传输。
- AAD 是可选的,用于提供额外的认证数据,但不加密。
- GCM 模式要求 IV 长度为 12 字节,否则可能影响安全性。






