工作模式(Mode of Operation)(空)
工作模式(Mode of Operation)(空)
AiY0u工作模式(Mode of Operation)的概念
在密码学中,工作模式(Mode of Operation) 是指块加密算法(如 AES、DES 等)处理任意长度明文的一套规则和流程。
块加密算法本身只能加密固定长度的明文块(例如 AES 处理 128 位块,DES 处理 64 位块),而实际需要加密的数据(如文件、消息)往往是任意长度的。工作模式的作用就是定义如何将这些 “固定长度块加密” 的基本操作扩展到 “任意长度数据加密”,同时解决安全性、效率、完整性等问题。
ECB**(Electronic Codebook)**:电子密码本模式
ECB是一种安全性不高的工作模式,仅适用于教学场合
它的加密流程为
也就是说把明文拆分成若干个明文块,再用相同的key对每个明文块执行块加密算法
显然,使用相同的密钥就代表着,如果拆出了两个相同的明文块,那么这两个明文块对应的密文块是完全相等的,攻击者可通过分析密文结构推断明文规律。
ECB加密ctf例题
Cryptohack ECB-Oracle | AiY0u的博客
CBC**(Cipher Block Chaining)**:密码分组链接模式
CBC的安全性比ECB高,它具有一个初始化向量iv,与第一个明文块异或,并且后一个明文块加密时,都要先与前一个明文块的加密结果异或。这样就能打乱密文结构,不会出现ECB那样的规律性。
加密:
解密:
但是我们注意到,CBC工作模式下所谓的“分组链接”,是通过异或来链接起来的,而异或属于一种线性变换,这就导致前后密文块的关系仍然没有被完全打乱
并且由于异或操作是容易预测的,我们观察上图可以发现,仅仅需要伪造一个iv或者伪造部分密文,就能干扰解密的正常进行,并更换解密结果
上面这种攻击方式叫做比特翻转攻击(bit flipping attack)
比特翻转攻击例题
OFB(Output Feedback Mode):输出反馈模式
OFB同样要求一个初始化向量
在工作时它通过加密反馈的方式生成密钥流,再与明文 / 密文进行异或运算来实现加密和解密
在这种工作模式下,分组密码已经转化为了流密码
OFB 模式在满足特定条件(IV 的唯一性、分组密码的安全性)时具有一定安全性,但相比 CTR 等现代模式存在明显局限性
CTR(Counter Mode):计数器模式
CTR 模式的核心是通过计数器生成一系列不同的输入块,再用分组密码加密这些块得到密钥流,最后将密钥流与明文异或得到密文,解密时重复相同过程
CTR 模式的计数器通常由两部分组成:
- Nonce(初始向量 IV):固定长度的随机值,必须在每次加密时唯一。
- 计数器值:与 Nonce 拼接后,每次加密一个数据块就递增(或递减)
加密第一个块:[Nonce || 00000000] → 加密生成密钥流块 1
加密第二个块:[Nonce || 00000001] → 加密生成密钥流块 2
以此类推,最终加密完成所有数据块
Nonce(Number Used Once),一次性随机数,每次加密时随机生成,长度通常为 64-96 位,必须保证唯一性
GCM(Galois/Counter Mode,伽罗瓦 / 计数器模式)
这个模式基于CTR进行加密,但是多了一个验证环节。
通过 “伽罗瓦域(Galois Field)哈希” 实现 “认证能力”(验证完整性与真实性)。
这里详细讲讲它的工作流程
1.加密阶段
在加密阶段与上述CTR模式完全一致,即
- 生成一系列“计数器块”
- AES加密计数器块生成密钥流
- 明文与密钥流异或
2.认证阶段
这里引入“关联数据AD”的概念:关联数据(AD,Associated Data)是 认证加密算法(AEAD,如 AES-GCM、ChaCha20-Poly1305) 中的核心概念,指 “不需要加密(不隐藏内容),但需要验证完整性和真实性” 的数据。它的核心作用是将 “加密数据(如正文)” 与 “辅助性数据(如元信息)” 绑定认证,确保整个数据组合(加密数据 + AD)未被篡改、未被伪造,同时避免因辅助数据被篡改而引发安全漏洞。
AD可以是时间戳、文件名、设备id等内容,它不进行加密操作,内容对第三方可见。AD与密文共享同一个认证标签,篡改任意一方都会导致认证失败。
认证阶段具体为:
-
数据预处理
将AD与密文C拼接,生成“待认证数据”,按照每128位为一块进行划分
强制追加 长度信息块:在分块末尾补充两个 64 位块,分别表示 “AD 的原始长度(比特数,大端序)” 和 “C 的原始长度(比特数,大端序)”(记为
Len_AD || Len_C)。最终待认证数据块序列为:
[B₁, B₂, ..., Bₙ, Len_AD, Len_C]。 -
初始化哈希值(H)
取一个 128 位全 0 块(即
0x00000000000000000000000000000000),用 AES 主密钥(记为 K)以 ECB 模式加密,生成的 128 位结果即为 GHASH 哈希密钥 H(公式:H = AES_K(全0块))。 -
伽罗瓦域乘法计算认证值(X):
-
初始化:设置初始认证值
X = 0(128 位全 0 块); -
逐块迭代:对 “待认证数据块序列” 中的每个块 B(从第一个数据块到最后一个长度块),依次执行:
1
X = (X XOR B) × H
其中XOR为逐比特异或运算,×为 GF (2¹²⁸) 域上的多项式乘法(遵循不可约多项式x¹²⁸ + x⁷ + x² + x + 1规则),该运算确保哈希结果具备 “线性不可逆性” 与抗碰撞性;
-
最终认证值:遍历所有块后,最终得到的 128 位
X即为 GHASH 中间认证值。
-
-
生成认证标签(Tag):
-
生成初始计数器块 J₀:
区分:
- 若 IV 长度为 12 字节(GCM 推荐长度,安全性最优):J₀ =
IV || 0x00000001(前 12 字节为 IV,后 4 字节为计数器初始值 1,均为大端序); - 若 IV 长度≠12 字节(如题目中 16 字节 IV):J₀ 需通过 GHASH 派生,公式为
J₀ = GHASH_H(IV || 0x00000000 || Len_IV)(其中Len_IV为 IV 的原始长度,64 位大端序),确保 J₀ 始终为 128 位,符合 AES 分组要求;
- 若 IV 长度为 12 字节(GCM 推荐长度,安全性最优):J₀ =
-
计算初始加密值 Y:用 AES 主密钥 K 以 ECB 模式加密 J₀,得到 128 位初始加密值
Y = AES_K(J₀); -
生成 Tag:将 GHASH 认证值 X 与初始加密值 Y 逐比特异或,结果即为最终认证标签 Tag(默认 128 位,可按需调整为 64/96/112/120 位,长度越长,抗暴力破解能力越强)。
-
3.解密与认证流程
解密端需获取 “密文 + IV + AD + 认证标签”,流程与加密对称:
-
验证认证标签:
解密端用相同的 “密钥、IV、AD” 和 “密文”,重新计算认证标签
Tag',并与收到的Tag对比。- 若
Tag' ≠ Tag:说明数据(密文或 AD)被篡改,或来源非法,立即拒绝解密; - 若
Tag' = Tag:认证通过,进入解密环节。
- 若
-
解密生成明文:
用相同的 “密钥、IV” 生成与加密端一致的 “密钥流”,将密文与密钥流异或,得到明文。






