文章目录
- 1. 概述
- 1.1 GHASH
- 1.3 GCTR
- 2. GCM 加密
- 3. GCM 解密
- 4. 总结
在我的另一篇博客【密码算法 之三】分组密码工作模式 (ECB \ CBC \ CFB \ OFB \ CTR \ XTS)浅析 中已经详细的介绍了对称算法(也称为“分组密码算法”)的各种工作模式。这些工作模式中,CBC、CFB、OFB 三种模式可以解决 ECB 模式中相同明文生成相同密文的缺陷,CTR 又可以在此基础上提供多分组并行加密特性,但是它们都不能提供密文消息完整性校验功能,所有就有了 GCM 模式。
1. 概述
GCM 全称为 Galois/Counter Mode,其中 G 是指 GMAC,C 是指 CTR 模式,可以将 GCM 认为是认证模式的一种,提供认证和加密两种功能。GCM模式的分组大小为128bit
。
在进行GCM原理分析之前,首先应该了解一下 GHASH函数 及 GCTR函数。
1.1 GHASH
GHASH函数利用了“伽罗瓦域算法”计算HASH值。关于伽罗瓦域算法的不在这里详述(有兴趣的可以自行学习)。
GHASH函数的执行步骤如下:
(1)将字符串 x 分为 128bit
的块 X1, X2, …, Xm;
(2)置 Y0 为 0128(即 Y0 为 128bit 的 0),由于 Y0 与 X1 异或不改变 X1 的值,故下图没有体现 Y0 的存在;
(3)Yi = (Yi-1 ⊕ Xi) • H (H为hash的子秘钥),最后的 Ym 即为本次计算的 hash值。
1.3 GCTR
GCTR函数的执行步骤如下:
(1)若X为空串(empty string),则返回空串Y;
(2)计算n的值,n = (len(X) + 127) / 128;
(3)X = X1 || X2 || … || Xn-1 || Xn* ,其中 X1, X2 , …, Xn-1都是完整的block,Xn* 可能是不完整的block;
(4)CB1 = ICB;
(5)For i = 2 to n,计算CBi(计算公式为:CBi = inc32(CBi-1),即逐个计算出CBi的值;
(6)For let i = 1 to n-1, Yi = Xi ⊕ CIPHK(CBi),首先对 CBi 加密,然后再与 Xi 异或运算得到 Yi;
(7)Yn* = Xn* ⊕ MSBlen(Xn)(CIPHK(CBi));当通过CIPHK(CBi)计算出结果后,仅取高位(len(Xn))的数据,然后与 Xn * 异或运算。
(8)Y = Y1 || Y2 || … || Yn-1 || Yn*;
2. GCM 加密
注:对数据P进行GCTR运算时,计数器值是从J1开始的(J0用在了最后HASH值的GCTR运算,如下图)
3. GCM 解密
4. 总结
- GCM运算所需的对称加密算法的分组长度必须是
128bit
(DES\3DES不满足添加,AES\SM4满足条件); - 加密时,在计算MAC之前必别将附加数据(A)及密文(C)分别进行Block对齐;
- GCM运算时,J0的获取需要分不同的情况,一种是len(IV)= 96bit,一种是len(IV) ≠ 96bit