【Joy of Cryptography 读书笔记】Chapter 8 分组密码的工作模式(Modes of Operation)

Chapter 8 分组密码的工作模式(Modes of Operation)


之前对于 分组密码(也称伪随机置换PRP)的讨论更多在于其输入是一个分组(blen)大小的情况。而实际应用中,明文的长度可能远超一个分组的大小。 分组密码的工作模式(Modes of Operation),就是指在输入大量明文时(多个分组)保证 CPA安全性的加密方法。

一、常见的工作模式

1、EBC(Electronic Codebook)

对于长度超过一个分组的明文,最容易想到的加密方法就是对每一个分组分别用分组密码加密,然后将所有结果拼接得到密文。然后解密的时候也是对每个分组分别解密。(如下图所示)

但是EBC模式不具备CPA安全性,因此千万不能使用!这是因为每个分组都重复使用密钥,而分组密码是确定性函数,明文相同密文必然相同,因此不具备CPA安全性。

2、CBC(Cipher Block Chaining)

在CBC模式中,对于长度为 l l l个分组的明文,它的密文长度为 l + 1 l+1 l+1个分组。其中密文的第一个分组称为初始向量(initialization vector,IV)。CBC模式采取的是上一章中 实现CPA安全性的三类方法中的增加随机性的方法。在加密过程中,它首先随机选择(均匀采样)一个IV,然后之后每一个分组的加密,都是将上一个分组与该组明文异或的结果作为分组密码( F F F)的输入,并把所有密文拼接得到最终结果。其解密过程则是每一组密文先根据分组密码的解密算法( F − 1 F^{-1} F1)解密(第一组除外),然后与前一组密文异或,恢复明文。

CBC模式是实际应用中最常使用的模式,而且可以实现CPA安全性。

个人理解CBC安全性(书上没说任何证明):类似第六章GCM PRG那块的构造,一组组证明 c i c_i ci是随机采样。 i i i i − 1 i-1 i1就是多一组分组密码的结果,而其输入是随机采样( c i − 1 c_{i-1} ci1随机,异或也随机,后者是一次性密码本的结论),得到的结果也随机(PRP是双射)

3、CTR(Counter)

在CTR模式中,对于长度为 l l l个分组的明文,它的密文长度同样也为 l + 1 l+1 l+1个分组。其中密文的第一个分组也称为初始向量(initialization vector,IV)。CTR模式实现CPA安全性方法类似引入nounce的方法,这里的nounce就是计数器 r r r。不过为了不让每次都从0开始计数,它也引入了IV作为计数器的初始值(其实这么看,更像是用了增加随机性的思想)。在加密过程中,它首先随机选择(均匀采样)一个IV,将其作为计数器 r r r的初始值——而计数器 r r r正是分组密码的输入。每一个分组所得的密文是该分组的明文与分组密码结果的异或。计算完后,计数器加一(下图中的 + 1 % 2 b l e m + 1 \%2^{blem} +1%2blem正是无符号加一)。对于解密算法而言,就根据IV计算每个分组对应的 F ( k , . ) F(k,.) F(k,.),然后与对应分组的密文异或,恢复明文。

可见,解密过程并没有用到分组密码的逆函数,所以其实CTR模式不要求 F F F是PRP,是PRF也可以。而现实中,CTR也是除CBC外最常用的模式。

个人理解CTR安全性(书上没说任何证明):依然类似第六章GCM PRG那块的构造,一组组证明 c i c_i ci是随机采样。如果F是安全的,那么每一次F的结果类似随机(计数器还保证了F输入不重复,可以用PRF安全性),异或之后的结果也是随机的(一次性密码本的结论)。

4、OFB(Output Feedback)

在OFB模式中,对于长度为 l l l个分组的明文,它的密文长度同样也为 l + 1 l+1 l+1个分组。其中密文的第一个分组也称为初始向量(initialization vector,IV)。在加密过程中,对于每一个分组, r r r通过分组密码 F ( k , r ) F(k,r) F(k,r)生成(更新,初始是IV),然后将 r r r与明文异或的结果作为密文。解密时,根据IV逐步得到每一个分组的 F ( k , . ) F(k,.) F(k,.),然后异或恢复明文(这里也不要求 F F F可逆)。

OFB模式在实际中很少使用,但是其安全性证明十分简单。

定理8.1 如果在上述OFB模式中 F F F是一个 i n = o u t = λ in=out=\lambda in=out=λ的安全的PRF,则OFB模式具备CPA安全性(定义7.2)。

证明:证明过程类似上一章 用PRF构造满足CPA安全性的密码,具体过程如下:

首先为使用PRF的安全性,第1步写成了调用PRF的形式,然后第2步使用PRF的安全性。可以看到,每一次的加密十分类似一次性密码本,但是一次性密码本的密钥(也就是这里的 r r r)需要是随机的,才有一次性密码本的安全性。因此这里两次利用了不重复选取和随机采样这两个不可区分库(第3-5步是不重复使得undefined分支去除,第6步则是将其恢复为随机取样)。最后内联整理,得证。

5、小结

书上提到,实践中保证CPA安全性时只用CBC、CTR模式。而两者之间有以下特点:

  • CBC模式解密需要用到分组密码的逆函数;CTR模式解密并没有需要分组密码的逆函数,因此是PRF即可
  • CBC模式的加密是串行的(依赖前一个分组的密文);CTR模式的加密可并行(因为知道计数器初始值就行)。不过两者的解密都可以并行(CBC解密的时候每个分组的密文已知;CTR的理由同加密)。
  • 为减少开销,CTR可以提前算出一些分组密码的值,毕竟只有IV影响;但是CBC不可以,因此它还受到输入明文的影响。
  • CTR中重复用IV会破坏安全性;CBC中只要两个明文的第一个块不一样,那么重复用IV也是安全的。

二、不考虑长度泄露的CPA安全性

严谨地说,根据上一章的CPA安全定义,上述提到的所有工作模式都不具备CPA安全性。因为上述提到的分组密码的密文长度与明文长度有关(blen+1),所以密文必然泄露长度信息。但是或许在一些情况下,我们并不在意长度信息的泄露。因此改进一下CPA安全性定义,不允许比较长度相关的信息。

对于定义7.1,将两库改为下图所示。增加的是标黄的部分,其实就是不允许两个明文长度不同。

对于定义7.2,将两库改为下图所示。增加的是标黄的部分,其实同样限制了明文长度一致。

本章第一节OFB模式的CPA安全性证明其实已经是改进过的定义7.2的库了,因为已经限制了长度。

不过到底能否忽略长度信息被泄露,是需要视具体情况而定的。因为在一定情况下,长度泄露也可能带来巨大的安全隐患。

三、非整分组长度下的加密

之前我们都假设输入的明文恰好能分成若干个完整的分组。那么如果明文长度并非是分组长度的整数倍呢?下面给出两种常见的处理方法。

1、填充(padding)

填充就是使得明文的长度恰好是分组长度的整数倍。填充方案最重要的是能够识别出未填充时的文本(unpad)。以下给出几种常见的填充方法:

  • 零填充(Null padding)

    顾名思义,就是在数据的最后面补零。但是这并不是任何时候都可行,比如数据最后本身有零的情况,就难以恢复原数据。

  • ANSI X.923 标准

    补零且最后一个字节的数值就是一共补的字节数量。如果本身就是分组长度的整倍数,需要多补一个分组。

  • PKCS#7 标准

    类似前一种,只不过一共补了 b b b个字节,就用 b b b来填充。

  • ISO/IEC 7816-4 标准

    用字节0x80以及后面补零的方式填充,所以0x80相当于分界符。

这里的填充方法并没有提及安全性

2、密文窃取(ciphertext stealing,CTS)

密文窃取的主要思想,就是依然用标准的分组密码的工作模式来加密,但是去掉部分密文(最后一个分组差 j j j bit就扔掉 j j j bit),而且依然能够解密。下面介绍一种采取了密文窃取的CBC模式。

简单而言,在加密算法中,对最后一个分组补齐 j j j bit的0,然后进行加密。然后输出密文的时候, c l − 1 c_{l-1} cl1的后 j j j bit去掉并在拼接中与 c l c_l cl交换位置。解密时,先求解出 j j j(根据密文长度即可求解,因为最后一个分组就少了 j j j bit),然后恢复 c l − 1 c_{l-1} cl1,之后就是正常的CBC解密。这个方法看起来复杂的是 c l 、 c l − 1 c_l、c_{l-1} clcl1的部分。其实因为加密中是补0,根据算法(异或),因此 c l c_l cl所对应的 F F F的输入 和 c l − 1 c_{l-1} cl1的后 j j j bit是相同的解密时可以通过解密 c l c_l cl恢复出 c l − 1 c_{l-1} cl1的后 j j j bit(上述原理如下图所示)。而之所以交换位置,只是为了方便操作(因为一般都是按照分组长度取数)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值