加密模式GCM示例
1 简介
使用范围更广和安全性较高的加密模式:GCM (Galois/Counter Mode) - Galois/计数器模式

定义:GCM 是 CTR 的认证加密扩展,提供机密性和完整性(AEAD - Authenticated Encryption with Associated Data)。
2 工作原理:
结合 CTR 加密和 Galois 乘法认证。
加密:使用 nonce 生成计数器,产生密钥流加密明文;
然后用 GHASH(Galois 哈希)计算认证标签(Tag),基于密文、关联数据(AAD)和密钥。
数学:Tag = GHASH(H, AAD, C) \oplus E_K(counter_0),其中 H = E_K(0)。
输出:密文 + Tag(通常 128 位)。
解密:验证 Tag 后解密。
优缺点:
优点:高效、并行、提供认证(防篡改、重放)。
缺点:nonce 必须唯一(推荐 96 位随机),重用 nonce 破坏安全。
安全考虑:IND-CCA2 安全。SM4-GCM 在 GB/T 38635.2-2020 标准中定义,用于高安全需求。
3 应用
SM4 应用:TLS 1.3、加密通信,适合需要完整性的场景如金融交易。
GCM 是对 CTR 模式的认证加密扩展(AEAD),结合了 CTR 的高效并行加密和 GHASH(基于 Galois 域乘法的通用哈希)来提供完整性认证。下面我基于您的内容进行补充和确认,并分别提供 Python 实现示例 和 SM4-GCM 的应用 说明。“拱廊”可能为“概要”或打字错误,我假设是整体概述。
定义与工作原理
定义:GCM 是 Authenticated Encryption with Associated Data (AEAD) 模式,提供机密性(confidentiality)和完整性/认证(integrity/authentication)。它基于 CTR 模式扩展,支持关联数据 (AAD) 的认证(AAD 被认证但不加密)。
工作原理:
使用 nonce (IV) 初始化计数器(通常 counter_0 = nonce || 0x00000001)。
CTR 加密:生成密钥流 Keystream = E_K(counter_1) || E_K(counter_2) || …,
然后密文 C = P ⊕ Keystream(P 为明文)。
认证:计算 GHASH(H, AAD || C || len(AAD) || len©),其中 H = E_K(0^128)(哈希子密钥)。
Tag = GHASH(…) ⊕ E_K(counter_0)。
输出:密文 C + Tag(Tag 默认 128 位,可缩短但不推荐)。
解密:先计算 Tag 并验证(若不匹配则拒绝),验证通过后再 CTR 解密。
数学表示(使用 LaTeX):
其中 GHASH 是 Galois 域 GF(2^{128}) 上的多项式哈希,Y_0 为初始计数器。
优缺点
优点:
高效、可高度并行化(加密/解密和 GHASH 可并行)。
提供强认证(防篡改、防重放攻击)。
支持 AAD,适合协议头部认证。
缺点:
Nonce 必须唯一(重用会导致密钥流重复,彻底破坏机密性和认证安全)。推荐使用 96 位随机 nonce。
Tag 缩短会降低认证强度。
不提供不可否认性(non-repudiation)。
4 示例安全考虑 (使用 AES-256-GCM)
Python 实现示例
标准 Python 库(如 cryptography)不支持 SM4,但有专用国密库支持 SM4-GCM。推荐使用 tongsuo-python-sdk(基于 Tongsuo 库,支持 pycryptodome 接口)或 GmSSL-Python。
这里使用 pycryptodome/tongsuo 风格的示例(安装:pip install tongsuopy 或相关 SDK):
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
import os
import binascii
生成随机密钥 (16 字节)、nonce (推荐 12 字节)、AAD
key = os.urandom(16) # SM4 密钥 128 位
nonce = os.urandom(12) # 推荐 96 位 nonce
aad = b"additional authenticated data" # 关联数据,可选
plaintext = b"Hello, SM4-GCM!"
-
加密
cipher = Cipher(algorithms.SM4(key), modes.GCM(nonce)) encryptor = cipher.encryptor() encryptor.authenticate_additional_data(aad) # 添加 AAD ciphertext = encryptor.update(plaintext) + encryptor.finalize() tag = encryptor.tag # 128 位 Tag print("密文:", binascii.hexlify(ciphertext)) print("Tag:", binascii.hexlify(tag)) -
解密与验证
cipher_dec = Cipher(algorithms.SM4(key), modes.GCM(nonce, tag)) decryptor = cipher_dec.decryptor() decryptor.authenticate_additional_data(aad) decrypted = decryptor.update(ciphertext) + decryptor.finalize()
print(“明文:”, decrypted) # 若 Tag 验证失败会抛异常
注意:需安装支持 SM4 的库(如 tongsuopy)。纯 Python 实现 GHASH 和 SM4 较慢,不推荐生产使用。
另一个选项:GmSSL-Python(ctypes 绑定 GmSSL C 库),示例类似但接口略不同。
5 小结
GCM提供 IND-CCA2 安全(选择密文攻击下不可区分)。
在中国国密标准中,SM4-GCM 被广泛推荐,用于高安全场景(如 TLS 1.3 中的 TLS_SM4_GCM_SM3 密码套件,定义于 RFC 8998)。
虽 GB/T 38635.2-2020 是关于 SM9 的,但 SM4 块密码标准为 GB/T 32907-2016,GCM 模式的操作规范参考通用块密码模式标准,并已在 TLS 等协议中标准化。
应用:TLS 1.3、IPsec、加密存储、金融交易(如支付网关)、视频加密传输等。适合需要同时保密和完整性的场景。
- 点赞
- 收藏
- 关注作者
评论(0)