加密模式GCM示例

举报
码乐 发表于 2025/12/21 05:31:16 2025/12/21
【摘要】 1 简介使用范围更广和安全性较高的加密模式:GCM (Galois/Counter Mode) - Galois/计数器模式定义:GCM 是 CTR 的认证加密扩展,提供机密性和完整性(AEAD - Authenticated Encryption with Associated Data)。 2 工作原理:结合 CTR 加密和 Galois 乘法认证。加密:使用 nonce 生成计数器,...

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):

H=EK(0128),Tag=GHASHH(AAD0vC0u[len(AAD)]64[len(C)]64)EK(Y0)H = E_K(0^{128}), \quad Tag = GHASH_H(AAD || 0^{v} || C || 0^{u} || [len(AAD)]_{64} || [len(C)]_{64}) \oplus E_K(Y_0)

其中 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、加密存储、金融交易(如支付网关)、视频加密传输等。适合需要同时保密和完整性的场景。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。