国密流行模式速览和简介
1 简介
SM4支持的标准加密模式主要基于国际通用的块密码模式,并在国密生态中得到实现和应用。
根据相关标准和开源实现(如GmSSL库),SM4常用的加密模式包括ECB、CBC、CFB、OFB和CTR。这些模式在实际应用中(如数据传输、存储加密、HTTPS等)被广泛采用,尤其在政府、金融和企业级系统中强制要求使用国密算法时。

流行的加密模式分析
以下是SM4最流行的5种加密模式(基于使用频率和标准支持度排序)。这些模式在Java、C语言实现和库(如Bouncy Castle、GmSSL)中均有支持。流行度考虑因素包括安全性、性能、易用性和应用场景(如ECB简单但不推荐用于敏感数据,CBC和CTR更流行于现代应用)
概览

2 各模式速览
-
- ECB (Electronic Codebook) - 电子码本模式
定义:ECB 是最简单的工作模式,将明文分成独立的分组,每组独立加密或解密。没有块间依赖。
工作原理:
加密:对于明文块 (第 i 个 128 位块),密文块 ,其中 是 SM4 加密函数,K 是密钥。
解密:,其中 是 SM4 解密函数。
如果明文长度不是 128 位的倍数,需要填充(Padding),如 PKCS#7。
优缺点:
优点:简单、并行化容易(每个块独立处理)、支持随机访问。
缺点:安全性低。如果明文中存在重复模式,密文中也会显现(模式泄露问题)。不抵抗重放攻击或篡改。
安全考虑:不推荐用于实际应用,除非数据高度随机(如加密密钥)。在 SM4 中,ECB 常用于测试或简单场景,但易受chosen-plaintext攻击。
SM4 应用:适合加密固定结构数据,如数据库字段,但需结合其他机制增强安全。
-
- CBC (Cipher Block Chaining) - 密码块链模式
定义:CBC 通过将前一个密文块与当前明文块异或(XOR)来引入块间依赖,提供更好的扩散性。
工作原理:
需要一个初始化向量(IV),长度 128 位,通常随机生成。
加密:,后续 。
解密:,后续 。
填充:同 ECB,需要填充最后一块。
优缺点:
优点:隐藏明文模式,提供语义安全(IND-CPA,如果 IV 随机)。
缺点:串行处理(加密需顺序),错误传播(一个块错误影响后续所有块)。易受 padding oracle 攻击如果实现不当。
安全考虑:IV 必须不可预测且唯一。SM4-CBC 在 TLS 等协议中常见,但需结合 MAC(如 HMAC)防止篡改。
SM4 应用:文件加密、VPN 数据传输,适合顺序数据流。
-
- CFB (Cipher Feedback) - 密码反馈模式
定义:CFB 将分组密码转换为流密码,通过反馈前一个密文块来生成密钥流。
工作原理:
使用 IV 作为初始输入。
加密:密钥流 ,;后续 ,。
解密:类似加密,但用密文生成密钥流:。
支持部分块(s 位反馈,通常 s=8 或 128),无需填充完整块。
优缺点:
优点:自同步(错误仅影响有限块)、支持任意长度数据、无需填充。
缺点:串行依赖,性能稍低。如果 IV 重复,可能泄露信息。
安全考虑:提供 IND-CPA 安全,但不提供完整性。SM4-CFB 常用于实时通信,避免 padding oracle。
SM4 应用:流式加密,如网络数据包或音频传输。
-
- OFB (Output Feedback) - 输出反馈模式
定义:OFB 类似于 CFB,但反馈的是加密输出而非密文,生成独立于明文的密钥流。
工作原理:
加密:初始 ,密钥流 ,。
解密:相同过程生成密钥流,。
支持部分块,无需填充。
优缺点:
优点:密钥流可预计算(并行友好)、错误不传播(仅影响当前位)。
缺点:如果密钥流重复使用,易受 XOR 攻击。IV 必须唯一。
安全考虑:提供 IND-CPA,但无认证。比 CFB 更易并行,但如果 IV 碰撞,安全性崩塌。
SM4 应用:加密噪声数据或预计算场景,如磁盘加密的前置阶段。
-
- CTR (Counter) - 计数器模式
定义:CTR 使用递增计数器生成密钥流,将分组密码转为流密码。
工作原理:
使用 nonce(类似 IV)和计数器(counter)组合成输入,通常 128 位:输入 = nonce || counter。
加密/解密:密钥流 ,,解密同。
无需填充,支持随机访问。
优缺点:
优点:高度并行、快速、无错误传播、支持任意长度。
缺点:nonce 必须唯一,否则密钥流重用导致灾难性泄露。
安全考虑:提供 IND-CPA,无内置认证。SM4-CTR 在现代协议中流行,如 IPsec。
SM4 应用:高性能加密,如 SSD 存储或云计算数据。
-
- GCM (Galois/Counter Mode) - Galois/计数器模式
定义:
GCM 是 CTR 的认证加密扩展,提供机密性和完整性(AEAD - Authenticated Encryption with Associated Data)。
工作原理:
结合 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 标准中定义,用于高安全需求。
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 = 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)。
安全考虑 (使用 AES-256-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、加密存储、金融交易(如支付网关)、视频加密传输等。适合需要同时保密和完整性的场景。
3 实现示例
标准 Python 库(如 cryptography)不支持 SM4,但有专用国密库支持 SM4-GCM。推荐使用 tongsuo-python-sdk(基于 Tongsuo 库,支持 pycryptodome 接口)或 GmSSL-Python。
这里使用 pycryptodome/tongsuo 风格的示例(安装:pip install tongsuopy 或相关 SDK):
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 库),示例类似但接口略不同。
- 点赞
- 收藏
- 关注作者
评论(0)