对称密码

多重加密

多重加密是将一个加密算法多次使用的技术,明文通过加密算法转化为密文,然后将该密文作为输入重新执行加密算法,该过程可以重复多次。

流密码是一种对称密码算法,其输出密文是由输入明文逐位或者逐字节产生的,RC4是应用最广泛的一种流密码。

寻找代替DES的新密码的理由是显然的:密钥的穷举攻击是可行的。
AES是一种新的安全的密码,在AES之前,还可以用DES进行多次加密,且使用多个密钥,三重DES(Triple-DES)被广泛接受。

双重DES

多次加密的最简单形式是进行两次加密,每次使用不同的密钥

  • C = EK2(EK1(P))
  • P = DK1(DK2(C))

这种方法的密钥长度是56x2=112位

虽然双重DES对应的映射与单DES对应的映射不同,但是有中途相遇攻击 “meet-in-the-middle”

  • 只要连续使用密码两次,这种攻击总是有效
  • 因为X = EK1(P) = DK2(C)
  • 用所有可能的密钥加密明文P并把结果存储起来
  • 然后用所有可能的密钥解密密文C,寻找匹配的X值
  • 因此复杂度只有$O(2^{56})$

中途相遇攻击

这种攻击对使用两次加密的分组密码都有效
C=EK2[EK1[P]],则X=EK1[P]=DK2[C]
若已知(P, C),则
对256个可能的K1加密P,结果存入表中,按X值排序
对256个可能的K2解密C,在表中寻找匹配
如果产生匹配,则用一个新的明文密文对检测所得两个密钥
如果两密钥产生正确的密文,则接受为正确密钥
对任意给定的明文P,双重DES产生的密文有264可能,密钥空间为2112。对给定明文P,可产生给定密文C的密钥的个数平均为2112/264=248。上述攻击过程对第一个(P,C)对将产生248个错误的结果,而对第二个(P,C)对,错误结果的概率就降为248-64 =2-16,即中途相遇攻击使用两组已知明密文对就可以检测到正确密钥的概率是1-2-16,攻击双重DES,工作量仅为256,与攻击单DES所需的255差不多。

使用两个密钥的三重DES

使用两个密钥进行三次加密:E-D-E sequence
C=EK1[DK2[EK1[P]]
如果K1=K2,则相当于单次DES
已被用于密钥管理标准ANSI X9.17和ISO8732
当前还没有对三重DES的可行攻击方法

使用三个密钥的三重DES

虽然对于使用两个密钥的Triple-DES还没有实际的成功攻击,但是仍然令人有些担心
因此可以考虑使用三个密钥的Triple-DES,这样,密钥的长度就是168位
C = EK3[DK2[EK1[P]]]
使用三个密钥的Triple-DES如今已被广泛采用,如PGP, S/MIME
当然还有使用更多重DES的,如5DES

分组密码的工作模式(Block Cipher Modes)

总共有五种:
ECB CBC CFB OFB CTR

电码本模式 Electronic Codebook

明文分成64位的分组进行加密,不足64位再填充,每个分组都用同一个密钥加密
即同样的明文分组就会得到相同的密文

ECB

局限性

主要局限来自于ECB的密文分组是互相独立的
适合数据量比较少的时候,比如传输DES密钥
而对于很长的消息尤其是比较结构化的消息,ECB是不安全的,通过结构特征可能会被破解

密文分组链接模式 Cipher Block Chaining

为了解决ECB的密文分组相互独立的问题,CBC的加密输入当前的明文分组和上一次密文分组的异或,使用相同的密钥加密
因此即使两个明文分组相同,一般情况下它们的密文分组也会不同

其中
$ C_1 = E(K, [IV \oplus P_1]) $
$ P_1 = IV \oplus D(K, C_1) $

CBC

优点和局限性

明文消息中有一个变化都会影响(后面)所有的密文分组,有很好的扩散性
但是发送方和接收方需要共享一个初始向量IV (Initial Value)

  • 如果IV被明文传送,则攻击者可以改变第一个分组的某些位,然后预先改变IV中的某些位,则接收者收到的P1也就相应改变了
  • 因此,IV 必须是一个固定的值或者必须用ECB方式在消息之前加密传送

两种计算IV的方法:

用加密函数加密一个时变值,所用密钥和明文加密所用密钥相同。这个时变值对每次加密运算来说必须唯一。
例如:时变值可以是一个计数器,一个时间戳或者消息数目。
第二种方法是用随机数发生器产生一个随机数分组。

长度不够的分组,可以填充已知非数据值,或者在最后一块补上填充位的长度

b1 b2 b3 0 0 0 0 5
三个数据字节,还有五字节的填充数据加计数

密码反馈模式 Cipher FeedBack

CFB

是一种将DES转化成流密码的技术,不再要求报文被填充成整个分组,可以实时运行,如果要传输一个字符流,每个字符都可以使用面向字符的流密码加密后立即传输。

加密

加密函数的输入是一个64位的移位寄存器,产生初始向量IV。加密函数高端j位与明文P1的第一单元异或,产生j位密文C1进入移位寄存器低端,继续加密,与P2输入异或,如此重复直到所有明文单元都完成加密。

解密

采用相同方案,但是使用加密函数而非解密函数。

设MSNs(X)表示X的最左边s位。则

$C_1 = P_1 \oplus MSB_s[E(K, IV)]$
从而有
$P_2 = C_1 \oplus MSB_s[E(K, IV)]$

优点与局限

当数据以位或字节形式到达时使用都是适当的
最通用的是流密码形式

输出反馈模式 Output FeedBack

结构上类似CFB,但是OFB中加密函数输出被反馈回移位寄存器,CFB中是密文单元被反馈回移位寄存器。优点是传输中的比特差错不会传播,缺点是比CFB更容易受报文流篡改攻击

OFB

优点与局限

OFB的一个优点是传输过程中在某位上发生的错误不会影响到其他位。比如,C1中有1位发生了错误,只会影响到P1的恢复,后续的明文单元不受影响。
OFB的缺点是,抗消息流篡改攻击的能力不如CFB。即密文中的某位取反,恢复出的明文相应位也取反

计数器模式 Counter

与OFB很像,但是加密的是计数器的值而不是任何反馈回来的值
每一个明文分组都必须使用一个不同的密钥和计数器值,决不要重复使用

$C_i = P_i \oplus O_i$
$O_i = DES_{K1}(i)$

可以用于高速网络加密中

CTR

优点与局限

高效
可以做并行加密
对高速链路的突发数据加密尤其有效
可以对被加密的分组进行随机存取
相当安全
简洁
必须决不重复使用密钥和计数器值