# AES-GCM（伽罗瓦/计数器模式的 AES）是什么？

> AES-GCM 是以伽罗瓦/计数器模式运行的 AES 分组密码，属于 AEAD 算法，用计数器模式加密、用 GHASH 认证标签保证完整性。

Source: https://ssl.sh/zh/glossary/aes-gcm/
Last updated: 2026-11-10

AES-GCM 把 AES 的计数器模式（把分组密码变成密钥流）和 GHASH（一种在二元域上的多项式认证算法）组合在一起，输出密文和 128 位认证标签。它由 NIST SP 800-38D 规定，是一种 [AEAD](https://ssl.sh/zh/glossary/aead/) 算法。TLS 中使用 128 位或 256 位 AES 密钥和 96 位 nonce：TLS 1.2 有 ECDHE-RSA-AES128-GCM-SHA256 等套件，[TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/) 有 TLS_AES_128_GCM_SHA256 和 TLS_AES_256_GCM_SHA384。

## 为什么重要
AES-GCM 是服务器和桌面浏览器之间最常协商出的 TLS 加密算法。现代 x86 和 ARMv8 处理器都带有专门的 AES 指令和无进位乘法指令，用它们实现的 AES-GCM 速度很快，也能抵御缓存时序攻击。没有这类硬件的处理器上，软件 AES 既慢又难以做到恒定时间，所以服务器通常同时提供 [ChaCha20-Poly1305](https://ssl.sh/zh/glossary/chacha20-poly1305/) 供这类客户端选择。云服务器选型时，CPU 是否支持 AES 指令会直接影响 HTTPS 的加解密开销。

## 例子
在服务器上测一下 AES-GCM 的性能，并对照 TLS 中的套件名称：

```bash
openssl speed -evp aes-128-gcm
openssl speed -evp aes-256-gcm
```

```text
TLS 1.3: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384
TLS 1.2: ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384
```

## 常见误区
- **只有 AES-256-GCM 才够安全。** AES-128 提供 128 位安全强度，正是 TLS 通常追求的水平；选 AES-256 多是出于合规要求或更长远的安全余量，代价是略慢。
- **GCM 的 nonce 偶尔重复没关系。** 同一密钥下重复 nonce 会泄露两段明文的异或值，还能让攻击者伪造认证标签。TLS 用记录序号派生 nonce，正确实现不会出现重复。
- **用了 AES-GCM 就有前向保密。** 前向保密取决于密钥交换，AES128-GCM-SHA256 这个套件使用静态 RSA 密钥传输，并不具备前向保密。

## 相关术语

- [AEAD](https://ssl.sh/zh/glossary/aead/): AEAD 是带关联数据的认证加密算法，一次运算同时完成数据加密和完整性认证，并能保护不加密的附加数据不被篡改。
- [ChaCha20-Poly1305](https://ssl.sh/zh/glossary/chacha20-poly1305/): ChaCha20-Poly1305 是把 ChaCha20 流密码与 Poly1305 认证算法组合而成的 AEAD 算法，专为纯软件实现时的高速和恒定时间而设计。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
- [3DES](https://ssl.sh/zh/glossary/3des/): 3DES 是把 DES 连续执行三次的分组密码，分组长度只有 64 位，主要因 Sweet32 攻击而在 TLS 中被视为应淘汰的旧算法。
