国密流行模式速览和简介

举报
码乐 发表于 2026/01/08 09:33:12 2026/01/08
【摘要】 1 简介SM4支持的标准加密模式主要基于国际通用的块密码模式,并在国密生态中得到实现和应用。根据相关标准和开源实现(如GmSSL库),SM4常用的加密模式包括ECB、CBC、CFB、OFB和CTR。这些模式在实际应用中(如数据传输、存储加密、HTTPS等)被广泛采用,尤其在政府、金融和企业级系统中强制要求使用国密算法时。流行的加密模式分析以下是SM4最流行的5种加密模式(基于使用频率和标准...

1 简介

SM4支持的标准加密模式主要基于国际通用的块密码模式,并在国密生态中得到实现和应用。

根据相关标准和开源实现(如GmSSL库),SM4常用的加密模式包括ECB、CBC、CFB、OFB和CTR。这些模式在实际应用中(如数据传输、存储加密、HTTPS等)被广泛采用,尤其在政府、金融和企业级系统中强制要求使用国密算法时。

流行的加密模式分析

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

概览

image.png

2 各模式速览

    1. ECB (Electronic Codebook) - 电子码本模式

定义:ECB 是最简单的工作模式,将明文分成独立的分组,每组独立加密或解密。没有块间依赖。
工作原理:

加密:对于明文块 PiP_i(第 i 个 128 位块),密文块 Ci=EK(Pi)C_i = E_K(P_i),其中 EKE_K 是 SM4 加密函数,K 是密钥。

解密:Pi=DK(Ci)P_i = D_K(C_i),其中 DKD_K 是 SM4 解密函数。
如果明文长度不是 128 位的倍数,需要填充(Padding),如 PKCS#7。

优缺点:

优点:简单、并行化容易(每个块独立处理)、支持随机访问。
缺点:安全性低。如果明文中存在重复模式,密文中也会显现(模式泄露问题)。不抵抗重放攻击或篡改。

安全考虑:不推荐用于实际应用,除非数据高度随机(如加密密钥)。在 SM4 中,ECB 常用于测试或简单场景,但易受chosen-plaintext攻击。

SM4 应用:适合加密固定结构数据,如数据库字段,但需结合其他机制增强安全。

    1. CBC (Cipher Block Chaining) - 密码块链模式

定义:CBC 通过将前一个密文块与当前明文块异或(XOR)来引入块间依赖,提供更好的扩散性。
工作原理:
需要一个初始化向量(IV),长度 128 位,通常随机生成。
加密:C1=EK(P1IV)C_1 = E_K(P_1 \oplus IV),后续 Ci=EK(PiCi1)C_i = E_K(P_i \oplus C_{i-1})
解密:P1=DK(C1)IVP_1 = D_K(C_1) \oplus IV,后续 Pi=DK(Ci)Ci1P_i = D_K(C_i) \oplus C_{i-1}
填充:同 ECB,需要填充最后一块。

优缺点:
优点:隐藏明文模式,提供语义安全(IND-CPA,如果 IV 随机)。
缺点:串行处理(加密需顺序),错误传播(一个块错误影响后续所有块)。易受 padding oracle 攻击如果实现不当。

安全考虑:IV 必须不可预测且唯一。SM4-CBC 在 TLS 等协议中常见,但需结合 MAC(如 HMAC)防止篡改。
SM4 应用:文件加密、VPN 数据传输,适合顺序数据流。

    1. CFB (Cipher Feedback) - 密码反馈模式

定义:CFB 将分组密码转换为流密码,通过反馈前一个密文块来生成密钥流。
工作原理:
使用 IV 作为初始输入。
加密:密钥流 S1=EK(IV)S_1 = E_K(IV)C1=P1S1C_1 = P_1 \oplus S_1;后续 Si=EK(Ci1)S_i = E_K(C_{i-1})Ci=PiSiC_i = P_i \oplus S_i
解密:类似加密,但用密文生成密钥流:Pi=CiSiP_i = C_i \oplus S_i
支持部分块(s 位反馈,通常 s=8 或 128),无需填充完整块。

优缺点:
优点:自同步(错误仅影响有限块)、支持任意长度数据、无需填充。
缺点:串行依赖,性能稍低。如果 IV 重复,可能泄露信息。

安全考虑:提供 IND-CPA 安全,但不提供完整性。SM4-CFB 常用于实时通信,避免 padding oracle。
SM4 应用:流式加密,如网络数据包或音频传输。

    1. OFB (Output Feedback) - 输出反馈模式

定义:OFB 类似于 CFB,但反馈的是加密输出而非密文,生成独立于明文的密钥流。
工作原理:
加密:初始 S0=IVS_0 = IV,密钥流 Si=EK(Si1)S_i = E_K(S_{i-1})Ci=PiSiC_i = P_i \oplus S_i
解密:相同过程生成密钥流,Pi=CiSiP_i = C_i \oplus S_i
支持部分块,无需填充。

优缺点:
优点:密钥流可预计算(并行友好)、错误不传播(仅影响当前位)。
缺点:如果密钥流重复使用,易受 XOR 攻击。IV 必须唯一。

安全考虑:提供 IND-CPA,但无认证。比 CFB 更易并行,但如果 IV 碰撞,安全性崩塌。
SM4 应用:加密噪声数据或预计算场景,如磁盘加密的前置阶段。

    1. CTR (Counter) - 计数器模式

定义:CTR 使用递增计数器生成密钥流,将分组密码转为流密码。
工作原理:
使用 nonce(类似 IV)和计数器(counter)组合成输入,通常 128 位:输入 = nonce || counter。
加密/解密:密钥流 Si=EK(noncei)S_i = E_K(nonce || i)Ci=PiSiC_i = P_i \oplus S_i,解密同。
无需填充,支持随机访问。

优缺点:
优点:高度并行、快速、无错误传播、支持任意长度。
缺点:nonce 必须唯一,否则密钥流重用导致灾难性泄露。

安全考虑:提供 IND-CPA,无内置认证。SM4-CTR 在现代协议中流行,如 IPsec。
SM4 应用:高性能加密,如 SSD 存储或云计算数据。

    1. 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 库),示例类似但接口略不同。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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