信息安全工程师考试里,分组密码是一个年年必考、但大部分考生只背结论不挖原理的知识点。很多人能脱口而出"DES 分组是 64 位、AES 分组是 128 位",可一旦题目把问法换成"哪一种工作模式会把分组密码变成流密码"或者"哪一种模式的错误不会扩散到后续分组",立刻开始犯迷糊。问题不在于记忆量不够,而在于没有真正理解分组密码为什么需要工作模式、五种经典工作模式各自在解决什么矛盾。这篇文章不堆结论,而是从分组密码的底层机制出发,把电码本、密文分组链接、密文反馈、输出反馈、计数器五种工作模式的原理、差异、适用场景和命题人的挖坑套路一次性讲透。
要理解工作模式,必须先分清两个被很多人混为一谈的概念:分组密码算法本身,与分组密码的工作模式。分组密码算法,指的是一类以固定长度分组为单位进行加密的对称密码算法。按照中国国家密码管理局与信息安全工程师考试教材的通行定义,分组密码将明文消息划分为若干个长度相等的分组,然后对每一个分组在密钥控制下分别进行加密变换。这里的"分组长度"是算法固化在结构里的一个参数,DES 的分组长度是 64 位,AES、SM4 的分组长度是 128 位。密钥长度则是另一个参数,DES 的有效密钥是 56 位,AES 支持 128、192、256 位三种密钥,SM4 的密钥长度是 128 位。
分组密码算法解决的是"一个固定长度分组的加密变换"问题。它把一段固定长度的明文块,在密钥的作用下,变成同样长度的密文块。这个变换本身是可逆的、确定性的:同一个明文块在同一个密钥下,永远得到同一个密文块。这个"确定性"在单块加密时没有问题,但当明文长度超过一个分组时,矛盾就出现了。因为真实要加密的明文几乎不可能恰好是一个分组的整数倍,而且就算恰好是整数倍,直接用"每个分组独立加密"的方式去处理长明文,也会带来严重的安全缺陷——相同明文分组会暴露相同密文分组,从而泄露明文的统计规律。
工作模式,正式名称是分组密码的运算模式或者工作模式,它定义的是"如何利用分组密码算法对长度超过一个分组的明文进行加密"的一整套规则。国家标准与密码学教材通常给出的定义是:工作模式是在分组密码算法的基础上,把分组密码变换逐组串联起来,处理任意长度明文的机制。它解决的核心问题有三个:第一,如何处理长度不是分组整数倍的明文,也就是填充问题;第二,如何消除相同明文分组产生相同密文分组的问题,也就是随机化问题;第三,如何把分组密码这种按块处理的构件,改造成既能加密也能作为消息认证码、密钥流生成器等不同用途的基础模块。
这里要特别强调一个容易混淆的点:工作模式不是一种新的加密算法,它建立在既有的分组密码算法之上,同一套工作模式可以配 DES,也可以配 AES、SM4。比如同样用 CBC 模式,底层换成 AES 就是 AES-CBC,换成 SM4 就是 SM4-CBC。信息安全工程师考试经常在这个点上设置陷阱,让考生误以为工作模式本身决定了加密强度,实际上决定保密强度的是底层分组密码算法,工作模式决定的是处理长明文的方式以及密文之间的关联结构。理解了这一层,后面五种模式的区别就水到渠成了。
分组密码工作模式的演进,本质上是在解决同一个问题——怎样让"逐组加密"这件事既不泄露明文规律,又兼顾效率、并行性和错误控制。五种经典模式给出了五种不同的取舍方案,理解了每一种模式的反馈结构,也就理解了它的一切特性。
电码本模式,也就是 ECB 模式,是五种工作模式里结构最简单的一种。它的加密规则可以概括为一句话:把明文切分成一个个独立的分组,每一个分组都用同一个密钥、同一个加密函数独立加密,密文分组之间没有任何关联。它的名字来源于一个很形象的比喻:在 ECB 模式下,加密函数相当于一本厚厚的"电码本",每一个明文分组都能在电码本里查到它唯一对应的密文分组,同一个明文分组查到的一定是同一个密文分组。
这个"唯一对应、互不影响"的特性,既是 ECB 模式最大的优点,也是它最致命的缺点。优点是结构简单、没有依赖关系,因此加密和解密都可以完全并行,一个分组算错了不会影响其他分组。缺点是它的确定性完全暴露了明文的分组模式:如果明文里有两段完全相同的内容,而且它们恰好对齐在分组的边界上,那么这两段内容加密后得到的密文也完全相同。攻击者即使不知道密钥,也能通过观察密文中的重复块,推断出明文中存在重复内容,甚至结合已知明文猜出敏感信息的分布。正因为这个缺陷,ECB 模式在现代安全实践中几乎不再用于加密机密数据,但考试却格外喜欢考它,因为它最适合用来检验考生是否真正理解了"确定性泄露"这个原理。
密文分组链接模式,也就是 CBC 模式,是经典工作模式里应用最广泛的一种。它解决 ECB 确定性缺陷的手段非常巧妙:在加密每一个明文分组之前,先把它和上一个密文分组做一次异或运算,再送入加密函数。这样一来,每一个密文分组不仅取决于当前的明文分组和密钥,还取决于前面所有明文分组的累积影响,相同明文分组在不同位置会得到完全不同的密文分组,ECB 模式的信息泄露问题被彻底消除。
CBC 模式引入了一个新的参数——初始向量,也就是 IV。它是第一个分组加密前用来做异或的那个"伪密文分组",因为第一个明文分组之前没有真正的密文分组可以拿来异或。IV 的选取有一个考试反复考的要点:IV 不需要保密,可以明文传送,但必须具有不可预测性,实践中通常要求随机生成。这一点和"密钥必须保密"形成了鲜明对比,是命题人最爱挖的坑。CBC 模式的另一个重要特性是它的错误传播规律:解密时,如果某一个密文分组在传输中出错,它会导致当前分组和下一个分组的明文都出错,但再往后的分组不受影响。这个"一个密文错误污染两个明文块"的规律,是计算题和判断题里的高频考点。
密文反馈模式 CFB 和输出反馈模式 OFB,是两个经常被放在一起对比的模式,它们共同的特点是:都不再直接加密明文分组,而是让分组密码充当一个密钥流生成器,把分组密码这种块加密构件改造成了类似序列密码、也就是流密码的工作方式。这正是"分组密码系统和序列密码系统"那道分类题背后隐藏的技术逻辑。
CFB 模式的做法是:加密函数先对上一个密文分组进行加密,得到一个输出块,再把这个输出块和当前明文分组异或,产生当前密文分组。注意这里的微妙之处——送入加密函数的不是明文,而是密文,加密函数的输出也不再直接作为密文,而是作为"密钥流"去和明文异或。正因为密文被反馈回输入端,CFB 模式天然具有和 CBC 类似的随机化效果,相同明文分组不会产生相同密文分组。
OFB 模式和 CFB 只有一处关键差别,但这一处差别带来了截然不同的特性。OFB 模式反馈回加密函数输入端的不是密文,而是加密函数自身的输出。换句话说,OFB 模式让加密函数在密钥和 IV 的基础上,反复迭代产生一串和明文、密文都无关的输出块,这些输出块构成密钥流,再与明文异或得到密文。由于密钥流完全独立于明文和密文,OFB 模式可以预先离线计算密钥流,加密时只做一次异或,速度极快;更重要的是,它的错误完全不传播——密文里的一个比特错误,解密后只影响对应的一个明文比特。这一点和 CBC、CFB 形成鲜明对比,也是选择题里反复出现的辨析点。
计数器模式 CTR 是五种模式里设计最现代的一种。它的思路和 OFB 类似,也是把分组密码当密钥流生成器用,但生成密钥流的方式换成了对计数器加密。具体来说,CTR 模式维护一个计数器,对每一个分组,先把当前计数器值送入加密函数,得到一个输出块,再和明文分组异或得到密文分组,然后计数器递增,处理下一个分组。
计数器模式最大的优势在于并行性和随机访问。因为每一个分组的密钥流只取决于计数器的值,与前后分组都没有关系,所以所有分组可以同时加密、同时解密,这在多核处理器和高速网络上优势巨大。同时,由于密钥流是按计数器位置生成的,可以直接定位到任意一个分组进行解密,而不必像 CBC 那样必须从头顺序解密,这种随机访问能力让它非常适合磁盘加密等场景。计数器模式的约束只有一个,而且必须严格遵守:同一个密钥下,计数器的取值不能重复。一旦计数器重复,就会出现两个分组使用同一段密钥流的情况,此时攻击者可以对两段密文异或,消除密钥流的影响,进而分析明文,后果和 ECB 模式一样严重。
理解了五种模式各自的反馈结构之后,还需要站在更高的层面,把它们放在"安全需求、效率需求、错误控制需求"三个维度上做一次系统的比较,才能真正建立选择模式时的判断能力。
从安全性角度,最核心的衡量标准是"相同明文分组是否会产生相同密文分组"。ECB 模式因为没有任何随机化机制,是五种模式里唯一一个会泄露明文统计规律的,因此它的安全性最弱,考试中凡是涉及"应避免使用哪种模式"的题,答案几乎都
本篇完!