在密码学中，**伽罗瓦/计数器模式**( **GCM** ) 是对称密钥加密分组密码的一种操作模式，因其性能而被广泛采用。可以使用廉价的硬件资源实现最先进的高速通信通道的 GCM 吞吐率。 该操作是一种经过身份验证的加密算法，旨在提供数据真实性（完整性）和保密性。 GCM 是为块大小为 128 位的块密码定义的。 伽罗瓦消息认证码（**Galois Message Authentication Code** ，**GMAC** ) 是 GCM 的仅认证变体，可以形成增量消息认证代码。 GCM 和 GMAC 都可以接受任意长度的初始化向量。

不同的分组密码操作模式可能具有明显不同的性能和效率特性，即使使用相同的分组密码也是如此。 GCM 可以充分利用并行处理，实现 GCM 可以有效利用指令流水线或硬件流水线。相比之下，密码块链接（CBC）操作模式会导致流水线停顿，从而影响其效率和性能。

基本操作
----

与普通计数器模式一样，块按顺序编号，然后该块编号与初始化向量（Initialization Vector，IV） 组合并使用块密码E加密，通常为AES 。然后将此加密的结果与明文进行异或以产生密文。与所有计数器模式一样，这本质上是一个流密码，因此对于每个加密的流使用不同的 IV 是必不可少的。

密文块被视为多項式的系数，然后在依赖于密钥的点H使用有限域算术对其进行评估。然后对结果进行加密，生成可用于验证数据完整性的身份验证标签。然后，加密文本包含 IV、密文和身份验证标签。

GCM加密操作

数学基础
----

GCM 将众所周知的计数器加密模式与新的 Galois 身份验证模式相结合。关键特征是用于验证的伽罗瓦域乘法易于并行计算。此功能允许比使用链接模式的加密算法（如 CBC ）更高的吞吐量。使用的 GF(2 128 ) 字段由多项式定义

{\displaystyle x^{128}+x^{7}+x^{2}+x+1}
身份验证标签是通过将数据块输入 GHASH 函数并对结果进行加密来构建的。这个 GHASH 函数定义为

{\displaystyle {\text{GHASH}}(H,A,C)=X\_{m+n+1}}
其中*H* = *E k* (0 128 ) 是哈希密钥，使用分组密码加密的 128 个零位的字符串， *A*是仅经过身份验证（未加密）的数据， *C*是密文， *m*是 128- *A 中的*位块（向上取整）， *n是 C*中 128 位块的数量（向上取整），对于*i* = 0, ... *m* + *n* + 1*的变量 X i*定义如下。 

首先，经过验证的文本和密文分别用零填充到 128 位的倍数，并组合成单个消息*S i* ：

{\displaystyle S\_{i}={\begin{cases}A\_{i}&{\text{for }}i=1,\ldots ,m-1\\A\_{m}^{\*}\parallel 0^{128-v}&{\text{for }}i=m\\C\_{i-m}&{\text{for }}i=m+1,\ldots ,m+n-1\\C\_{n}^{\*}\parallel 0^{128-u}&{\text{for }}i=m+n\\\operatorname {len} (A)\parallel \operatorname {len} (C)&{\text{for }}i=m+n+1\end{cases}}}
其中 len( *A* ) 和 len( *C* *) 分别是 A*和*C*的位长的 64 位表示， *v* = 连（*一*） 模组 *128 是 A*的最后一个块的位长， *u* = 长度( *C* ) 模组 *128 是 C*的最后一个块的位长，并且\parallel表示位串的串联。

{\displaystyle X\_{i}=\sum \_{j=1}^{i}S\_{j}\cdot H^{i-j+1}={\begin{cases}0&{\text{for }}i=0\\\left(X\_{i-1}\oplus S\_{i}\right)\cdot H&{\text{for }}i=1,\ldots ,m+n+1\end{cases}}}
第二种形式是一种有效的迭代算法（每个*X i*取决于*X* *i* -1 ），它是通过将霍纳的方法应用于第一种而产生的。只有最后的*X* *m* + *n* +1仍然是输出。

如果需要并行化哈希计算，可以通过交错*k*次来完成：

{\displaystyle {\begin{aligned}X\_{i}^{'}&={\begin{cases}0&{\text{for }}i\leq 0\\\left(X\_{i-k}^{'}\oplus S\_{i}\right)\cdot H^{k}&{\text{for }}i=1,\ldots ,m+n+1-k\\\end{cases}}\\[6pt]X\_{i}&=\sum \_{j=1}^{k}\left(X\_{i+j-2k}^{'}\oplus S\_{i+j-k}\right)\cdot H^{k-j+1}\end{aligned}}}
如果 IV 的长度不是 96，则使用 GHASH 函数计算*Counter 0* ：

{\displaystyle {\begin{aligned}Counter0={\begin{cases}IV\parallel 0^{31}\parallel 1&{\text{for }}len(IV)=96\\{\text{GHASH}}(\ IV\parallel 0^{s}\ \parallel \ 0^{64}\parallel len\_{64}(IV)\ ){\text{ with }}s=(128-(len(IV)\mod 128))\mod 128&{\text{otherwise}}\end{cases}}\end{aligned}}}
GCM 由John Viega和 David A. McGrew 设计，是对Carter-Wegman 计数器模式（CWC 模式）的改进。 

2007 年 11 月， NIST宣布发布 NIST 特别出版物 800-38D*对块密码操作模式的建议：伽罗瓦/计数器模式 (GCM) 和 伽罗瓦消息验证码（GMAC），*使 GCM 和 GMAC 成为官方标准。

利用
--

GCM 模式用于IEEE 802.1AE (MACsec) 以太网安全、 IEEE 802.11ad （也称为WiGig ）、ANSI ( INCITS )光纤通道安全协议 (FC-SP)、 IEEE P1619 .1 磁带存储、 IETF IPsec标准、   SSH ，  TLS 1.2  和 TLS 1.3。  AES-GCM 包含在NSA Suite B 密码学及其 2018 年商业国家安全算法 (CNSA)套件中的最新替代品中。  GCM 模式用于SoftEther VPN服务器和客户端， 以及自 2.4 版以来的OpenVPN。

表现
--

GCM 要求对每个加密和验证数据块（128 位）在 Galois 字段中进行一次分组密码操作和一次 128 位乘法。分组密码操作很容易流水线化或并行化；乘法运算很容易流水线化，并且可以通过一些适度的努力进行并行化（通过并行化实际操作，通过根据原始 NIST 提交调整 Horner 的方法，或两者兼而有之）。

英特尔添加了PCLMULQDQ指令，突出了它对 GCM 的使用。  2011 年，SPARC 添加了 XMULX 和 XMULXHI 指令，它们也执行 64 × 64 位无进位乘法。 2015 年，SPARC 添加了 XMPMUL 指令，该指令对更大的值执行 XOR 乘法，高达 2048 × 2048 位的输入值产生 4096 位的结果。这些指令支持 GF(2 *n* ) 上的快速乘法，并且可以与任何字段表示一起使用。

GCM 在许多平台上发布了令人印象深刻的性能结果。 Käsper 和 Schwabe 描述了一种"更快且抗时间攻击的AES-GCM"  ，它在 64 位英特尔处理器上实现了每字节 10.68 个周期的 AES-GCM 认证加密。Dai等人。使用 Intel 的 AES-NI 和 PCLMULQDQ 指令时，对于相同的算法，每字节报告 3.5 个周期。 Shay Gueron 和 Vlad Krasnov 在第三代英特尔处理器上实现了每字节 2.47 个周期。为 OpenSSL和NSS库准备了适当的补丁。 

当需要对消息执行身份验证和加密时，软件实现可以通过重叠这些操作的执行来实现速度提升。通过交错操作利用指令级并行性来提高性能。这个过程称为函数拼接，  ，虽然原则上它可以应用于密码算法的任何组合，但 GCM 特别适合。 Manley 和 Gregg 展示了在 GCM 中使用函数拼接时优化的简易性。他们提出了一个程序生成器，它采用加密算法的带注释的 C 版本，并生成在目标处理器上运行良好的代码。

例如，GCM 在嵌入式领域受到 Silicon Labs 的批评，因为并行处理不适合加密硬件引擎的高性能使用，因此降低了一些对性能最敏感的设备的加密性能。

专利
--

根据作者的声明，GCM 不受专利保护。

安全性
---

GCM 在具体的安全模型中被证明是安全的。 当它与与随机排列无法区分的分组密码一起使用时，它是安全的；然而，安全性取决于为使用相同密钥执行的每个加密选择唯一的初始化向量*（参见*流密码攻击）。对于任何给定的密钥和初始化向量组合，GCM 仅限于加密239−256位纯文本 (64 GiB)。 NIST 特别出版物 800-38D 包括初始化向量选择指南。

身份验证强度取决于身份验证标签的长度，就像所有对称消息身份验证代码一样。不鼓励在 GCM 中使用较短的身份验证标签。标记的位长，用 t 表示，是一个安全参数。一般来说，t 可以是以下五个值中的任意一个：128、120、112、104 或 96。对于某些应用，t 可能是 64 或 32，但这两个标签长度的使用限制了输入的长度数据和密钥的生命周期。 NIST SP 800-38D 中的附录 C 为这些约束提供了指导（例如，如果 t = 32 且最大数据包大小为 210 字节，则应调用身份验证解密函数不超过 211 次；如果 t = 64 且最大数据包大小为数据包大小为 215 字节，认证解密函数调用不超过 232 次）。

与任何消息认证代码一样，如果对手*随机选择一个 t*位标签，则对于概率度量为 2 - *t 的*给定数据，它预计是正确的。然而，使用 GCM，对手可以通过选择带有 n 个单词的标签——密文的总长度加上任何额外的认证数据 (AAD)——以概率度量 2 - *t*乘以 n 来增加成功的可能性。尽管如此，必须记住，对于任意大的*t* ，这些最佳标签仍然由算法的生存度量1 − *n*⋅2−*t*主导。此外，GCM 既不适合用于非常短的标签长度，也不适合用于非常长的消息。

Ferguson 和 Saarinen 分别描述了攻击者如何针对 GCM 身份验证执行最优攻击，满足其安全性的下限。 Ferguson 表明，如果*n*表示编码中的块总数（GHASH 函数的输入），那么有一种方法可以构建目标密文伪造，预计成功的概率约为*n* ⋅2 − *t* .如果标签长度*t*小于 128，那么这次攻击中的每一次成功伪造都会增加后续有针对性的伪造成功的概率，并泄漏有关哈希子密钥的信息， *H* .最终， *H*可能会被完全破坏，并且完全失去认证保证。 

除了这种攻击，攻击者可能会尝试系统地猜测给定输入的许多不同标签以进行身份验证解密，从而增加其中一个（或多个）最终被视为有效的可能性。因此，实现 GCM 的系统或协议应监控并在必要时限制每个密钥的不成功验证尝试次数。

Saarinen 描述了 GCM弱密钥。 这项工作为基于多项式哈希的身份验证的工作原理提供了一些有价值的见解。更准确地说，这项工作描述了一种在给定有效 GCM 消息的情况下伪造 GCM 消息的特定方法，对于*n* × 128位长的*n*⋅2−128然而，这项工作并没有表现出比以前已知的更有效的攻击；本文观察 1 中的成功概率与 INDOCRYPT 2004 分析中引理 2 的成功概率相匹配（设置*w* = 128和*l* = *n* × 128 ）。 Saarinen 还描述了基于 Sophie Germain primes的 GCM 变体 Sophie Germain Counter Mode (SGCM)。

参见
--

* 认证加密
* 分组密码操作模式
* AES-GCM-SIV

参考文献
----

1. ↑  Lemsitzer, S.; Wolkerstorfer, J.; Felber, N.; Braendli, M. Paillier, P.; Verbauwhede, I. , 编.. Lecture Notes in Computer Science **4727**. Springer. 2007: 227–238. ISBN 978-3-540-74734-5. doi:10.1007/978-3-540-74735-2\_16.
2. ↑  McGrew, David A.  (PDF). 2005  [20 July 2013]. （原始内容存档 (PDF)于2016-03-03）.  *Note that there is a typo in the formulas in the article.*
3. ↑  RFC 4106 The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP)
4. ↑  RFC 4543 *The Use of Galois Message Authentication Code (GMAC) in IPsec ESP and AH*
5. ↑  RFC 5647 *AES Galois Counter Mode for the Secure Shell Transport Layer Protocol*
6. ↑  RFC 5288 *AES Galois Counter Mode (GCM) Cipher Suites for TLS*
7. ↑  RFC 6367 *Addition of the Camellia Cipher Suites to Transport Layer Security (TLS)*
8. ↑  RFC 8446 *The Transport Layer Security protocol version 1.3*
9. ↑ . 24 May 2016  [2022-01-03]. （原始内容存档于2020-04-16）.
10. ↑ .  [2022-01-03]. （原始内容存档于2013-03-11）.
11. ↑  Gueron, Shay.. April 2014  [2018-04-29]. （原始内容存档于2010-02-18）.
12. ↑  Käsper, E.; Schwabe, P. Clavier, C.; Gaj, K. , 编.. Lecture Notes in Computer Science **5747**. Springer. 2009: 1–17. ISBN 978-3-642-04138-9. doi:10.1007/978-3-642-04138-9\_1.
13. ↑  Gueron, Shay.  (PDF). Workshop on Real-World Cryptography.  [8 February 2013]. （原始内容存档 (PDF)于2014-03-10）.
14. ↑  Gopal, V. Feghali, W. Guilford, J. Ozturk, E. Wolrich, G. Dixon, M. Locktyukhin, M. Perminov, M. "Fast Cryptographic Computation on Intel Architecture via Function Stitching" （页面存档备份，存于） Intel Corp. (2010)
15. ↑  Manley, Raymond; Gregg, David. Gong, G.; Gupta, K.C. , 编.. Lecture Notes in Computer Science **6498**. Springer. 2010: 311–327. ISBN 978-3-642-17400-1. doi:10.1007/978-3-642-17401-8\_22.
16. ↑ . 2016-05-06  [2018-04-29]. （原始内容存档于2016-05-11）.
17. ↑  McGrew, David A.  (PDF). Computer Security Resource Center, NIST.  [2022-01-03]. （原始内容存档 (PDF)于2008-08-29）.
18. ↑  McGrew, David A.; Viega, John.. Lecture Notes in Computer Science **3348**. Springer. 2004. Bibcode:10.1.1.1.4591 请检查`|bibcode=`值 (帮助). ISBN 978-3-540-30556-9. doi:10.1007/978-3-540-30556-9\_27.
19. ↑  Niels Ferguson, Authentication Weaknesses in GCM （页面存档备份，存于）, 2005-05-20
20. ↑  Markku-Juhani O. Saarinen.. FSE 2012. 2011-04-20  [2022-01-03]. （原始内容存档于2020-11-23）.

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
分组密码 |
| --- |
|  |
| 常见加密算法 | 
* AES
* Blowfish
* DES（内部细节 · 3DES）
* Serpent
* Twofish

 |
|  |
| 次常见加密算法 | 
* Camellia
* CAST-128（英语：）
* IDEA
* RC2（英语：）
* RC5
* SEED（英语：）
* Skipjack（英语：）
* TEA
* XTEA

 |
|  |
| 其他加密算法 | 
* 3-Way（英语：）
* ABC（英语：）
* Akelarre（英语：）
* Anubis（英语：）
* ARIA（英语：）
* BaseKing（英语：）
* BassOmatic（英语：）
* BATON（英语：）
* BEAR and LION（英语：）
* CAST-256（英语：）
* CIKS-1（英语：）
* CIPHERUNICORN-A（英语：）
* CIPHERUNICORN-E（英语：）
* CLEFIA（英语：）
* CMEA（英语：）
* Cobra（英语：）
* COCONUT98（英语：）
* Crab（英语：）
* Cryptomeria/C2（英语：）
* CRYPTON（英语：）
* CS-Cipher（英语：）
* DEAL（英语：）
* DES-X（英语：）
* DFC（英语：）
* E2（英语：）
* FEAL（英语：）
* FEA-M（英语：）
* FROG（英语：）
* G-DES（英语：）
* GOST（英语：）
* Grand Cru（英语：）
* Hasty Pudding cipher（英语：）
* Hierocrypt（英语：）
* ICE（英语：）
* IDEA NXT（英语：）
* Intel Cascade Cipher（英语：）
* Iraqi（英语：）
* KASUMI（英语：）
* KeeLoq（英语：）
* KHAZAD（英语：）
* Khufu and Khafre（英语：）
* KN-Cipher（英语：）
* Ladder-DES（英语：）
* Libelle（英语：）
* LOKI97（英语：）
* LOKI89/91（英语：）
* Lucifer（英语：）
* M6（英语：）
* M8（英语：）
* MacGuffin（英语：）
* Madryga（英语：）
* MAGENTA（英语：）
* MARS（英语：）
* Mercy（英语：）
* MESH（英语：）
* MISTY1（英语：）
* MMB（英语：）
* MULTI2（英语：）
* MultiSwap（英语：）
* New Data Seal（英语：）
* NewDES（英语：）
* Nimbus（英语：）
* NOEKEON（英语：）
* NUSH（英语：）
* Q（英语：）
* RC6
* REDOC（英语：）
* Red Pike（英语：）
* S-1（英语：）
* SAFER（英语：）
* SAVILLE（英语：）
* SC2000（英语：）
* SHACAL（英语：）
* SHARK
* SM4
* Speck
* Spectr-H64（英语：）
* Square（英语：）
* SXAL/MBAL（英语：）
* Threefish（英语：）
* Treyfer（英语：）
* UES（英语：）
* Xenon（英语：）
* xmx（英语：）
* XXTEA
* Zodiac（英语：）

 |
|  |
| 密码设计 | 
* Feistel网络
* 密钥调度（英语：）
* 乘积密码
* S盒
* P盒
* 代换-置换网络
* 混淆與擴散
* 雪崩效应
* 密钥白化
* 密钥长度
* 块大小

 |
|  |
| 攻击（密码分析） | 
* 穷举攻击/蛮力攻击（EFF DES破解机）
* 中途相遇攻击（Biclique攻击（英语：） · 三子集中途相遇攻击（英语：））
* 线性密码分析（英语：）（堆积引理（英语：））
* 差分密码分析（不可能差分密码分析（英语：））
* 截断差分分析（英语：）
* 高阶差分分析（英语：）
* 差分-线性攻击（英语：）
* 区分攻击（英语：）（已知密钥区分攻击（英语：））
* 积分密码分析（英语：）
* 回力镖攻击（英语：）
* 模*n*密码分析（英语：）
* 相关密钥攻击（英语：）
* 滑动攻击（英语：）
* 回旋密码分析（英语：）
* 計時攻擊（英语：）
* XSL攻击（英语：）
* 插值攻擊
* Partitioning（英语：）
* 戴维斯攻击（英语：）
* 回弹攻击（英语：）
* 弱密钥（英语：）
* 肯德尔等级相关系数（英语：）
* 卡方检验
* 时间、内存、数据取舍攻击（英语：）

 |
|  |
| 密码标准 | 
* 高级加密标准（AES）评选过程
* CRYPTREC（英语：）
* NESSIE（英语：）

 |
|  |
| 工作方式 | 
* 初始向量
* 工作模式
* 填充

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
 雜湊函數 & 訊息鑑別碼 |
| --- |
|  |
| 
* 列表
* 比较
* 已知攻击

 |
|  |
| 常用函数 | 
* MD5
* SHA-1
* SHA-2
* SHA-3/Keccak
* BLAKE2

 |
|  |
| SHA-3入围（英语：） | 
* BLAKE
* Grøstl
* JH（英语：）
* Skein（英语：）
* Keccak（胜出）

 |
|  |
| 其他函数 | 
* ECOH（英语：）
* FSB（英语：）
* GOST（英语：）
* HAS-160（英语：）
* HAVAL（英语：）
* Kupyna（英语：）
* LM hash（英语：）
* MD2（英语：）
* MD4
* MD6
* MDC-2（英语：）
* N-Hash（英语：）
* RIPEMD
* RadioGatún（英语：）
* SWIFFT（英语：）
* SipHash（英语：）
* Snefru（英语：）
* Streebog（英语：）
* Tiger（英语：）
* VSH（英语：）
* WHIRLPOOL（英语：）
* SM3
* X11

 |
|  |
| 密码散列/密钥延伸函数 | 
* Argon2
* Balloon
* bcrypt
* Catena（英语：）
* crypt(3)（英语：） (DES)
* LM散列（英语：）
* Lyra2
* Makwa（英语：）
* PBKDF2
* scrypt
* yescrypt

 |
|  |
| 通用密钥派生函数 | 
* HKDF
* KDF1/KDF2

 |
|  |
| MAC算法 | 
* DAA（英语：）
* CBC-MAC（英语：）
* HMAC
* OMAC（英语：）/CMAC（英语：）
* PMAC（英语：）
* VMAC（英语：）
* UMAC（英语：）
* Poly1305

 |
|  |
| 认证加密模式 | 
* CCM（英语：）
* CWC（英语：）
* EAX（英语：）
* GCM
* IAPM（英语：）
* OCB（英语：）

 |
|  |
| 攻击 | 
* 碰撞攻击（英语：）
* 原像攻击
* 生日攻击
* 穷举攻击/蛮力攻击
* 彩虹表
* 旁路攻击
* 长度扩展攻击

 |
|  |
| 设计 | 
* 雪崩效应
* 碰撞
* 默克尔-达姆加德结构（英语：）

 |
|  |
| 标准化 | 
* CRYPTREC（英语：）
* NESSIE（英语：）
* NIST散列函数竞赛（英语：）

 |
|  |
| 实际应用 | 
* 盐
* 密钥延伸
* 信息鉴定

 |

 |

 |
|  |
| 

| * 
* 论
* 编
密码学 |
| --- |
|  |
| 
* 密码学历史
* 密码分析
* 密碼學主題列表

 |
|  |
| 
* 對稱密鑰加密
* 分组密码
* 流密码
* 公开密钥加密
* 密碼雜湊函數
* 訊息鑑別碼
* 随机数
* 隐写术

 |
|  |
| 
* 分类 分类
* 主题 主题
* 专题 专题

 |

 |

 |