国密加密OFB输出反馈模式
1 简介
OFB(Output Feedback)输出反馈模式OFB(Output Feedback Mode)作为五种用于 底 层对称密钥块密码算法的机密性作模式之一,电子密码本(ECB)、密码块链 (CBC)、密码反馈(CFB)、输出反馈(OFB)和计数器(CTR)。

其过程几乎与密码反馈模式相同,只是它以反馈方式发送加密输出,而非实际密码的异或输出。在该输出反馈模式下,分块的所有位都被发送,而不是发送选定的s位。
2 工作原理
分组密码的输出反馈模式对比特传输错误具有极强的抵抗力。它还减少了密码对明文的依赖或关系。
在密码学中,分组密码(如AES)旨在加密固定大小的数据块(例如128位)。输入块的大小通常与加密输出块的大小相同,而密钥长度可能不同。
流密码更灵活:它们设计用于加密任意大小的数据(例如PDF文档),有时可能以流形式出现(字节或帧序列,例如视频流)。
大多数流行的对称密钥加密算法都是分组密码,但密码学家提出了几种方案,将分组密码转换为流密码并加密任意大小的数据。这些方案被称为“分组密码作模式”,适用于大多数分组密码,如AES、RC6、Camellia、Serpent等。
当对称密码与分组作模式结合时,所得到的密码构造用密码名称、分组模式名称以及密钥大小表示。示例:
AES-256-GCM——带有256位加密密钥和GCM分组模式的AES密码
AES-128-CTR - AES密码,配备128位加密密钥和CTR分组模式
Serpent-128-CBC——带有128位加密密钥和CBC块模式的Serpent密码
-
工作原理
Oi = SM4(K, Oi-1) Ci = Pi ⊕ Oi -
特点
完全变成流密码
错误不扩散
- 安全性
中等
IV 绝不能复用
不防篡改
3 为什么OFB模式在工程中较少使用
OFB(Output Feedback)模式工作原理:
密钥流[n] = 加密(密钥流[n-1]) # 初始为IV
密文[n] = 明文[n] ⊕ 密钥流[n]
OFB的独特特性与问题:
- 预计算优势但实际受限
OFB可以预先生成密钥流
def ofb_precompute(iv, length):
keystream = []
current = iv
for _ in range(length):
current = sm4_encrypt(current) # 仅依赖前一个密钥流
keystream.append(current)
return keystream # 可离线计算
理论优势:在资源受限设备上,可在空闲时预计算密钥流。
实际问题:现代系统更看重实时性能和并行化,预计算优势不明显。
- 错误不传播的双刃剑
传输错误:密文比特翻转 → 仅影响对应明文的单个比特
解密结果:明文仅单个比特错误,其他部分完好
看似优点:在嘈杂信道中,错误影响最小化。
实际是致命缺陷:攻击者可以精准定位修改特定数据位!
攻击示例 - 数据库字段篡改:
- 假设加密的员工工资字段
原始数据: “salary:0100000” # 10,000元
加密后: 0x3A7F…
攻击者翻转密文的特定比特(无需知道密钥)
解密后变为: “salary:0900000” # 90,000元!
只有一位字符从’1’(0x31)变为’9’(0x39),其他字符不变
系统完全无法察觉
- 同步敏感性极高
IV必须唯一:IV重用会导致相同的密钥流,等同于一次一密的本重用
失去同步即永久失效:若加解密端状态不同步(丢包、位滑动),必须重新初始化整个会话
-
与CFB/CTR的对比劣势
特性 OFB CFB CTR 错误传播 无 有限 无 预计算能力 ✔️ ❌ ✔️ 并行加密 ❌ ❌ ✔️ 随机访问 ❌ ❌ ✔️ 自同步 ❌ ✔️ ❌
IV重用后果 灾难性(密钥流相同) 严重但可恢复 灾难性(密钥流相同)
关键洞察:OFB处在尴尬的中间位置:
想要错误不传播?CTR同样能做到且更优
想要自同步?CFB更合适
结果:OFB没有不可替代的独特优势
4 CTR为什么比OFB更优
决定性优势:并行化能力
CTR模式的天然并行性
def ctr_encrypt_parallel(plaintext, nonce):
# 生成计数器序列:完全独立!
counters = [nonce + i for i in range(len(plaintext))]
# 所有计数器可并行加密(硬件/多核优化)
keystream = parallel_execute(sm4_encrypt, counters)
# 并行异或操作
return parallel_xor(plaintext, keystream)
OFB模式的串行依赖
def ofb_encrypt_serial(plaintext, iv):
keystream = iv
ciphertext = []
for block in plaintext:
keystream = sm4_encrypt(keystream) # 必须等上一步完成
ciphertext.append(block ⊕ keystream)
return ciphertext
性能实测对比(理论):
数据量:1GB
假设SM4加密耗时:50ns/block (16字节)
CTR模式:
- 加密阶段:1000个核心并行 → 总时间 ≈ 主要开销在异或
OFB模式:
- 加密阶段:完全串行 → 1GB / 16B × 50ns ≈ 3.125秒
- 无法利用多核/GPU加速
工程友好性:
随机访问:CTR可直接解密文件中间部分,OFB必须从头开始
IV管理:CTR使用Nonce+Counter,更易保证唯一性
与认证组合:CTR+HMAC是标准模式,OFB较少见
- OFB的优点
在CFB的情况下,一个块中的单个比特错误会传播到所有后续块。这个问题被OFB解决了,因为它在明文块中没有位错误。因此,传输中的错误不会传播。
错误不扩散
预计算
无填充
- OFB的缺点
OFB的缺点是,由于其作模式相比CFB更容易受到消息流修改攻击。
如果密钥流被重复使用,安全性就会受到威胁。
不支持并行,
IV 复用即灾难,无完整性保证
无完整性 工程中较少使用,CTR 更优
- 点赞
- 收藏
- 关注作者
评论(0)