工作模式(Mode of Operation)(空)

工作模式(Mode of Operation)的概念

在密码学中,工作模式(Mode of Operation) 是指块加密算法(如 AES、DES 等)处理任意长度明文的一套规则和流程。

块加密算法本身只能加密固定长度的明文块(例如 AES 处理 128 位块,DES 处理 64 位块),而实际需要加密的数据(如文件、消息)往往是任意长度的。工作模式的作用就是定义如何将这些 “固定长度块加密” 的基本操作扩展到 “任意长度数据加密”,同时解决安全性、效率、完整性等问题。

ECB**(Electronic Codebook)**:电子密码本模式

ECB是一种安全性不高的工作模式,仅适用于教学场合

它的加密流程为image-20250715144919524

也就是说把明文拆分成若干个明文块,再用相同的key对每个明文块执行块加密算法

显然,使用相同的密钥就代表着,如果拆出了两个相同的明文块,那么这两个明文块对应的密文块是完全相等的,攻击者可通过分析密文结构推断明文规律。

ECB加密ctf例题

Cryptohack ECB-Oracle | AiY0u的博客

CBC**(Cipher Block Chaining)**:密码分组链接模式

CBC的安全性比ECB高,它具有一个初始化向量iv,与第一个明文块异或,并且后一个明文块加密时,都要先与前一个明文块的加密结果异或。这样就能打乱密文结构,不会出现ECB那样的规律性。

加密:

image-20250715160942718

解密:

image-20250715165020031

但是我们注意到,CBC工作模式下所谓的“分组链接”,是通过异或来链接起来的,而异或属于一种线性变换,这就导致前后密文块的关系仍然没有被完全打乱
并且由于异或操作是容易预测的,我们观察上图可以发现,仅仅需要伪造一个iv或者伪造部分密文,就能干扰解密的正常进行,并更换解密结果

上面这种攻击方式叫做比特翻转攻击(bit flipping attack)

比特翻转攻击例题

Cryptohack Flipping Cookie

OFB(Output Feedback Mode):输出反馈模式

image-20250716145935290

OFB同样要求一个初始化向量

在工作时它通过加密反馈的方式生成密钥流,再与明文 / 密文进行异或运算来实现加密和解密

在这种工作模式下,分组密码已经转化为了流密码

OFB 模式在满足特定条件(IV 的唯一性、分组密码的安全性)时具有一定安全性,但相比 CTR 等现代模式存在明显局限性

CTR(Counter Mode):计数器模式

CTR 模式的核心是通过计数器生成一系列不同的输入块,再用分组密码加密这些块得到密钥流,最后将密钥流与明文异或得到密文,解密时重复相同过程

image-20250716150004413

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模式完全一致,即

  1. 生成一系列“计数器块”
  2. AES加密计数器块生成密钥流
  3. 明文与密钥流异或

2.认证阶段

这里引入“关联数据AD”的概念:关联数据(AD,Associated Data)是 认证加密算法(AEAD,如 AES-GCM、ChaCha20-Poly1305) 中的核心概念,指 “不需要加密(不隐藏内容),但需要验证完整性和真实性” 的数据。它的核心作用是将 “加密数据(如正文)” 与 “辅助性数据(如元信息)” 绑定认证,确保整个数据组合(加密数据 + AD)未被篡改、未被伪造,同时避免因辅助数据被篡改而引发安全漏洞。

AD可以是时间戳、文件名、设备id等内容,它不进行加密操作,内容对第三方可见。AD与密文共享同一个认证标签,篡改任意一方都会导致认证失败。

认证阶段具体为:

  1. 数据预处理

    将AD与密文C拼接,生成“待认证数据”,按照每128位为一块进行划分

    强制追加 长度信息块:在分块末尾补充两个 64 位块,分别表示 “AD 的原始长度(比特数,大端序)” 和 “C 的原始长度(比特数,大端序)”(记为 Len_AD || Len_C)。

    最终待认证数据块序列为:[B₁, B₂, ..., Bₙ, Len_AD, Len_C]

  2. 初始化哈希值(H)

    取一个 128 位全 0 块(即 0x00000000000000000000000000000000),用 AES 主密钥(记为 K)以 ECB 模式加密,生成的 128 位结果即为 GHASH 哈希密钥 H(公式:H = AES_K(全0块))。

  3. 伽罗瓦域乘法计算认证值(X)

    • 初始化:设置初始认证值 X = 0(128 位全 0 块);

    • 逐块迭代:对 “待认证数据块序列” 中的每个块 B(从第一个数据块到最后一个长度块),依次执行:

      1
      X = (X XOR B) × H

      其中XOR为逐比特异或运算,×为 GF (2¹²⁸) 域上的多项式乘法(遵循不可约多项式x¹²⁸ + x⁷ + x² + x + 1规则),该运算确保哈希结果具备 “线性不可逆性” 与抗碰撞性;

    • 最终认证值:遍历所有块后,最终得到的 128 位 X 即为 GHASH 中间认证值。

  4. 生成认证标签(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 分组要求;
    • 计算初始加密值 Y:用 AES 主密钥 K 以 ECB 模式加密 J₀,得到 128 位初始加密值 Y = AES_K(J₀)

    • 生成 Tag:将 GHASH 认证值 X 与初始加密值 Y 逐比特异或,结果即为最终认证标签 Tag(默认 128 位,可按需调整为 64/96/112/120 位,长度越长,抗暴力破解能力越强)。

3.解密与认证流程

解密端需获取 “密文 + IV + AD + 认证标签”,流程与加密对称:

  1. 验证认证标签

    解密端用相同的 “密钥、IV、AD” 和 “密文”,重新计算认证标签 Tag',并与收到的 Tag 对比。

    • Tag' ≠ Tag:说明数据(密文或 AD)被篡改,或来源非法,立即拒绝解密
    • Tag' = Tag:认证通过,进入解密环节。
  2. 解密生成明文

    用相同的 “密钥、IV” 生成与加密端一致的 “密钥流”,将密文与密钥流异或,得到明文。