防窃听模式CFB
1 简介
国密SM4的CFB模式,,不具备完整性保护这就是为什么逐渐被 CTR / AEAD 模式取代。

现代密码学发展的核心趋势:从单纯保证机密性,到同时保证机密性、完整性和认证。我们来详细分析SM4-CFB模式的特点及其被取代的原因。
- 防窃听模式CFB(Cipher Feedback) 工作原理
将分组密码“转成流密码”:
Ci = Pi ⊕ SM4(K, Ci-1)
- 特点
不需要填充
支持按字节/位加密
- 安全性
⚠️ 中等
抵抗明文结构泄露
不具备完整性保护
- 优缺点
优点
支持流式数据
无填充
适合通信
缺点
误差扩散,性能一般
不认证数据
- 应用
实时通信
串口、流式链路
2 SM4-CFB模式原理与特点
CFB(Cipher Feedback)模式工作原理:
加密:前一个密文块作为输入,经过SM4加密后与明文块异或产生密文
密文[n] = 明文[n] ⊕ 加密(密文[n-1])
解密:使用相同的流程,因为异或操作的可逆性
明文[n] = 密文[n] ⊕ 加密(密文[n-1])
CFB的优点(相比CBC):
不需要填充:CFB是流密码模式,可将分组密码转换为自同步流密码
错误传播有限:单个比特错误只影响当前块和下一个块的对应位置
支持实时加密:适合数据流加密,无需等待完整分组
3 为什么CFB逐渐被CTR/AEAD取代
- 缺乏完整性保护是根本缺陷
这是CFB被淘汰的最核心原因。我们通过实例说明:
场景:银行使用SM4-CFB加密传输交易指令:“转账1000元给账户A”
攻击示例 - 比特翻转攻击:
原始密文流:C1 C2 C3 C4 C5 …
对应明文: “转 账 1 0 0 0 元 给 账 户 A”
攻击者操作:
-
定位到加密金额的位置(假设已知或可猜测格式)
-
将密文字节C3的某个比特翻转(异或特定值)
-
修改后的密文仍能成功解密,但:
- 解密后的"1"可能变成"9"(ASCII码0x31 → 0x39)
- 结果:“转账9000元给账户A”
关键问题:接收方无法检测密文是否被篡改!攻击无需知道密钥,只需知道数据格式和位置。
- CFB的其他局限性
- a. 无法并行加密
CFB必须串行加密(伪代码示意)
def cfb_encrypt(plaintext, iv):
ciphertext = []
prev_cipher = iv
for block in plaintext:
keystream = sm4_encrypt(prev_cipher) # 依赖前一个密文
cipher_block = block ⊕ keystream
ciphertext.append(cipher_block)
prev_cipher = cipher_block # 串行依赖
return ciphertext
而CTR模式可以完全并行:
def ctr_encrypt(plaintext, nonce):
ciphertext = []
# 所有计数器值可预先计算
counters = [nonce + i for i in range(len(plaintext))]
keystreams = parallel_sm4_encrypt(counters) # 并行加密!
for i, block in enumerate(plaintext):
ciphertext.append(block ⊕ keystreams[i])
return ciphertext
- b. 错误传播特性在现代网络中弊大于利
历史优势:在易出错的通信信道(如早期无线电),CFB的错误有限传播是优点
现代劣势:在TCP/IP等可靠传输协议上,错误传播无意义,反而影响性能
- c. 初始化向量(IV)管理复杂
CFB需要随机且唯一的IV
但IV重用导致的后果不如CTR模式严重,降低了开发者的警惕性
4 完整性缺失导致的具体攻击场景
场景1:加密数据库字段
– 使用CFB加密的信用卡号字段
加密存储:0x7A3F… (SM4-CFB加密"1234-5678-9012-3456")
攻击者:
1. 即使不知密钥,也可将密文中的某些比特翻转
2. 数据库查询仍能返回"解密后"的数据,但可能是:
"1234-5678-9012-8456" -- 最后几位被修改
3. 系统无任何异常告警!
场景2:物联网设备控制指令
设备接收加密指令(SM4-CFB):
“OPEN_VALVE=50%&TIMEOUT=60s”
攻击者通过有线/无线嗅探:
1. 截获加密数据包
2. 修改特定位置的密文比特
3. 设备解密后执行:
"OPEN_VALVE=100%&TIMEOUT=3600s" -- 阀门全开1小时!
4. 无完整性校验 → 设备执行恶意指令
场景3:协议降级攻击
在混合支持CFB和GCM的系统中:
客户端支持:GCM, CBC, CFB
服务器支持:GCM, CFB
中间人攻击:
- 拦截TLS握手,将算法列表中的GCM移除
- 强制双方使用CFB模式
- 后续通信无完整性保护,可随意篡改
5 CTR/AEAD模式的全面优势
CTR(计数器)模式优势:
完全并行:所有计数器块可同时加密
随机访问:可直接解密任意位置数据
无需填充:天然支持任意长度数据
与认证结合简单:CTR+HMAC是常见安全组合
AEAD(认证加密)模式(如GCM)的绝对优势:
- 机密性+完整性+认证三位一体
- GCM工作流程
ciphertext, tag = gcm_encrypt(
plaintext=“转账1000元”,
key=sm4_key,
nonce=随机数,
aad=“交易ID:12345” # 额外认证数据
)
- 解密时自动验证
try:
plaintext = gcm_decrypt(ciphertext, tag, key, nonce, aad)
# 任何篡改都会在此抛出异常
except AuthenticationError:
reject_message() # 密文被篡改!
- 抗重放攻击能力
通过aad(附加认证数据)可以绑定序列号、时间戳:
加密{明文:指令, aad:“seq=1001|time=2024-01-01 10:00:00”}
攻击者重放旧包 → 序列号/时间戳验证失败 → 拒绝
- 性能优化
硬件加速:现代CPU(Intel AES-NI)和密码芯片对GCM有专门优化
单次处理:加密和认证一次完成,比"CTR+HMAC"两次遍历高效
- 国密标准的发展趋势
现行国密标准体系:
GB/T 17964-2021:定义了SM4的各种工作模式
实际应用推荐:
首选:SM4-GCM(GB/T 36624-2018)
次选:SM4-CTR + HMAC-SM3
遗留系统:SM4-CBC/CFB + HMAC-SM3
避免使用:纯SM4-ECB/CBC/CFB(无认证)
迁移路径示例:
传统系统:SM4-CFB加密存储
风险:数据可被悄无声息地篡改
升级方案:
1. 短期:添加HMAC-SM3认证(Encrypt-then-MAC)
2. 中期:迁移到SM4-CTR + HMAC-SM3
3. 长期:全面采用SM4-GCM
SM4-CFB被取代的根本原因在于:它只解决了"偷看"问题,但没解决"篡改"问题。
在现代威胁模型中:
机密性威胁(偷看)依然存在
完整性威胁(篡改)更为常见和危险
认证需求(身份确认)必不可少
6 小结
CFB模式诞生于以"防窃听"为主要威胁的时代,而现代密码学已进入"认证加密"时代。
SM4-GCM等AEAD模式提供了"一键式"安全解决方案,开发者不再需要手动组合加密和认证组件,从根本上避免了因错误实现导致的安全漏洞。
因此,在新系统中采用SM4-GCM,不仅更安全,而且更简单、更高效,符合"安全默认化"的设计原则。CFB模式仅应在维护遗留系统或特定约束环境下使用,且必须与HMAC-SM3等认证机制配对使用。
- 点赞
- 收藏
- 关注作者
评论(0)