密钥生成
- 如何安全地生成密钥。即如何生成可信任的密钥,保证用户得到的密钥是安全的, 生成密钥的机器或程序是可信的。
- 如何生成安全的密钥。安全的密钥没有统一准确的定义,但一般来说是指密钥抗 猜测和抗穷举等针对密钥攻击的能力。涉及密钥长度和密钥强弱的问题。
分组加密
- 对称加密算法按其加密数据的方式一般来说可以分成两种类型:分组加密和序列加密。
- 分组加密又称为块加密,是将要处理的数据分成固定的长度,然后在这固定长度的数据上使用密码算法进行计算。
- 序列加密模式又称为流加密方式,是对要处理的数据按位 (或字节)逐个进行加密处理。
注意事项
- 算法加密模式的安全性。虽然加密模式不会对密码算法本身的安全性产生影响,但是一个差的算法加密模式可能会增加攻击者攻击成功的机会,甚至提供机会。例如,如果相同的明文加密后总是产生相同的密文,就很容易被攻击者利用。
- 算法加密模式的容错性。加密的数据通常要经过网络传输,网络传输中出现差错是很可能的,这时候就需要考虑算法的容错性。有些算法会导致错误扩散,其中一位出错 而导致多位甚至多个字节不能正常解密。
- 算法加密模式的效率。算法加密模式的选择,对加密效率会有影响,一般来说, 要基本保证加密模式的效率不会比算法本身的效率低过多。
- 算法加密模式的实时性。不同的算法加密模式实时性不同,有的算法可以一边加密一边实时传输和解密,有些则需要等到一个数据块全部接收到了才能进行解密。在不同的应用中,对实时性的要求是不一样的。
常用的分组加密模式有四种,分别是:电子密码本模式 (ECB)、加密分组链接模式 (CBC)、加密反馈模式 (CFB)和输出反馈模式 (OFB)。下面重点介绍这四种加密模式, 对其他的加密模式仅作简单的概括。
电子密码本模式(ECB)
-
电子密码本模式 (ECB)是最简单的分组加密模式,也是最能体现 “分组”概念的加 密模式。它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相 同的密钥进行加密。比如 DES算法,使用一个64位的密钥,如果采用该模式加密,就是 将要加密的数据分成每组64位的数据,如果最后一组不够64位,那么就补齐为64位, 然后每组数据都采用DES算法的64位密钥进行加密 。 如图所示是电子密码本模式的加密和解密的流程图,图中P0、P1是明文分组,C0、C1是相应的密文分组。
- 比如对“My name is DragonKing”这句话,就可以8个字符(64位)为一分组,形成图所示的这样的分组,最后一个分组不足8个字符,可以采用其他数据填充补齐。
- 电子密码本加密模式的每个分组的加密是相互独立的,相互之间没有关系,可以不必按顺序进行,各分组也可以并行进行加密和解密。这在某些应用方式下是非常有用的,比 如数据库加密。如果使用电子密码本模式对数据库中的每个记录进行加密,那么数据库的 存取就会非常方便,每个记录都可以独立进行加密和解密的存取、添加或者删除等操作, 而且可以进行并行的处理以提高速度。
- 电子密码本模式加密的数据,如果密文数据出错了,解密的时候会影响整个明文分组,可能导致整个明文分组不能正确地解密,但是不会影响其他明文分组。电子密码本模式对密文数据的增减是十分敏感的,如果密文数据中插入或丢失了一位数据,那么随后的整个密文序列都将不能正确地解密,这称为同步错误。所以,使用电子密码本模式的时候,必须确保密文分组的完整性。
- 采用电子密码本模式加密,相同的明文采用相同的密钥加密总是得到相同的密文,对于加密大量数据的密钥来说,这非常容易受到攻击。大量信息的情况下会有很多数据重复,那么如果攻击者知道了一段明文对应的密文,无论那段密文在哪儿出现,他都能解密该密文。更加严重的是,如果电子密码本模式加密的是一种有固定结构的信息,那么攻击者甚至可以不通过破译密钥就能达到自己的目的。
电子密码本模式(ECB)的特点
- 每次加密的数据长度固定。
- 各个分组相互独立,可以并行加密和解密。
- 相同的明文使用相同的密钥总是产生相同的密文。
- 一个位的错误只对所在的明文块产生影响,但是增加或删除一个位会导致其后整个密文序列没有办法正确解密。
加密分组链接模式(CBC)
- 加密分组链接模式 (CBC)可以解决电子密码本模式(ECB)容易受到分组替换攻击的问题。
- 加密分组链接模式首先也是将明文分成固定长度的分组,然后将前面一个加密分组输出的密文与下一个要加密的明文分组进行异或操作计算,将计算结果再用密钥进行加密得到密文。第一明文分组加密的时候,因为前面没有加密的密文,所以需要一个初始化向量 (IV)。跟电子密码本模式不一样,通过链接关系,使得密文跟明文不再是一一 对应的关系,破解起来更困难,而且克服了只要简单调换密文分组就可能达到目的的攻击。加密分组链接模式的流程如图所示,其中P0、P1是明文分组,C0、C1是密文分组,IV 是初始向量。
- 加密分组链接模式的过程用数学公式表示如下:
- 使用不同的初始向量,相同的明文使用相同的密钥会产生完全不同的密文,这使得攻击者对密文的分析更加困难;而使用相同的初始化向量,相同的明文使用相同 的密钥还是会产生相同的密文,这是我们不愿意看到的结果,所以一般应该避免重复 利用初始向量。
- 初始向量在加密分组链接模式中没有任何保密价值,因为除第一个分组外,加密分组链接中其他分组用来跟明文进行异或的数据都是前面输出的密文分组,而这个密文分组显 然是可以在网络上简单获取的,所以,即便你对初始向量进行保密,也仅仅对第一个分组 有一点点意义,而对其他大部分分组来说没有任何意义。
加密分组链接模式的缺点之一是会造成错误扩散。对于明文错误来说,性质并不是很严重,因为经过加密和解密来说恢复的明文还只是发送错误的地方有错误,不会扩散到别的地方。而且,明文发生错误的可能性较小。 密文发生错误的可能性更大,因为密文要经过有许多不可确定因素的网络的传播。 - 在加密分组链接模式中,如果密文有一位发生了错误,那么其后的一个分组中相应的位会发生错误,该分组的明文不能恢复,但是错误分组的第二个分组之后的分组不会受这个错误 的影响,这称为加密分组链接模式的自恢复功能。
- 跟电子密码本模式一样,加密分组链接模式也不能恢复同步错误。也就是说,如果密文中增加或删除了一位,那么该位以后的所有密文的解密都将难以得到正确的明文结果。 所以使用加密分组链接和电子密码本模式都需要确保分组链接的完整性。
- 加密分组链接模式虽然对抵抗分组重复攻击和分组替换攻击有效,但是很容易受到干扰性的攻击。比如攻击者可以在密文之后附加一些信息,而接收者没有办法发现这是附加 的信息,虽然可能是乱码,但有时候可能导致其他重大的安全问题。攻击者还可以利用加 密分组链接错误扩散的特点进行破坏性的攻击,比如通过改变一个分组的一位从而控制下 面一个分组相应位的变化,甚至通过删除或增加一位密文数据从而使得明文无法恢复,等 等。此外,如果使用相同的初始化变量和加密密钥加密的信息数据量太大,一样会给攻击 者提供大量的信息,这也是需要注意的。
加密分组链接(CBC)模式特点
- 每次加密的数据长度固定。
- 当相同的明文使用相同的密钥和初始向量的时候 CBC模式总是产生相同的密文。
- 链接操作使得密文分组要依赖当前和以前处理过的明文分组,密文分组顺序不能进行重新排列,也不能进行并行操作。
- 可以使用不同的初始化向量来避免相同的明文产生相同的密文,能一定程度上抵抗字典攻击等密文分析。
- 一位发生错误后,会对当前及后一个分组的明文产生错误。增加或删除一个位会导致其后整个密文序列没有办法正确解密。
- 不能实时解密,必须等到8个字节都接收到之后才能开始解密,否则得不到正确的结果。
加密反馈模式(CFB)
- 在加密分组链接模式下,必须等整个分组的数据接收完之后才能进行解密,不能实时解密,这在很多网络应用中是不适合的。加密反馈模式 (CFB)正是了为了适应这种要求作的改进。
- 加密反馈模式通过引入移位寄存器来克服加密分组链接模式不能实时解密的困难。如图所示是带64位移位寄存器的加密反馈模式的加密和解密流程图 。 图 中 C2 、 C3 及 P10等都是一个字节 (8位)的数据,所以能够实现字符的实时加密和解密,不用再等到8个 字节都接收到之后再进行解密。图中是在进行第10个字节数据的加密和解密过程,在该过程中,先从移位寄存器取8个字节的数据 (C2到C9)用密钥进行加密,然后取加密数 据最左边的一个字节跟输入的明文 P10进行异或操作,得到的值作为输出密文 C10,同时 将 C10送入到移位寄存器中。
- 跟加密分组链接模式一样,加密反馈模式的密文也跟以前所有的明文有关系,具有相关联的关系。在刚开始的时候,移位寄存器也要使用初始向量填充。初始向量同样没有必 要保密,其原因跟加密分组链接模式是一样的。对不同的消息,初始向量应更换,以保证 在使用相同的密钥加密信息的时候不会产生重复的密文,比如可以使用不断增大的索引号 码作为初始向量。
- 加密反馈模式同样存在错误扩散的问题。明文错误不会有太大的影响,如果明文其中 一位出错了,解密后它也只会影响明文错误的那一位。
- 但是密文错误影响就会严重得多。在如图所示的加密反馈模式中,如果密文中有 一位发生了错误,那么当前字节的密文及随后8个字节的密文的解密都会受到影响,可能 会导致无法正确解密。因为在这9个字节的解密计算都使用到了该错误的密文。但是在这9个字节之后,密文就能自动恢复到正常解密的状态。 对于同步错误,加密反馈模式同样具有自恢复的功能,如果密文数据中增加或删除一位,在这一位进入到寄存器的时候,会影响其所在的8个字节,然后移出寄存器,密文就 恢复了正确解密。
- 基于加密反馈模式的错误扩散性能,攻击者一样可以通过更改密文某些位使得密文解 密成另外一些消息。
加密反馈模式(CFB)特点
- 每次加密的数据不超过64位。
- 当使用相同的密钥和初始向量的时候,相同明文使用 CFB模式加密输出相同的密文。
- 链接操作的方法使得密文数据依赖当前和以前所有的数据,所以数据都应该按顺序组织在一起,不能进行并行计算操作。
- 可以使用不同的初始变量使相同的明文产生不同的密文,防止字典攻击等密文分析行为。
- CFB模式的强度依赖于密钥的长度,强度最大的情况是每次加密的数据长度和密钥长度相同的情况。
- 当每次加密的数据长度的取值比较小的时候,相同的明文一般需要更多的循环来完成加密,这可能会导致过大的开销。
- 每次加密数据的位数应该为8的整数倍。
- 一旦某位数据出错,会影响到目前和其后一些字节的加密数据的正确解密,但是对同步错误具有自恢复功能。
- 数据可以实时传输,每接收到一位都可以随即进行解密。
输出反馈模式(OFB)
- 输出反馈模式也需要使用初始向量对寄存器进行初始化,初始化向量也不需要保密。
- 输出反馈模式不存在错误扩散的问题,如果密文的一位发生了错误,那么只会影响其对应明文的一个位,而不会影响别的位。对于同步错误,输出反馈模式没有自恢 复功能,所以一旦增加或删除了密文的一位,该位后面的所有密文都将不能正确 解密。
- 输出反馈模式的密文与前后数据的相关性小,所以安全性相对于加密分组链接模式和 加密反馈模式比较弱。输出反馈模式使用密文序列跟明文异或产生明文,而密文序列由密 钥本身产生,这肯定具有周期性,在使用相同密钥加密的数据到达一定数量时,会产生重 复,这就会大大降低算法的安全性。
特点
- 每次加密的数据不超过64位。
- 当使用相同的密钥和初始向量的时候,相同明文使用 OFB模式加密输出相同的密文。要注意的是,在 OFB模式下相同的密钥和初始向量产生相同的密钥流,所以,为了 安全原因,一个特定的初始向量对一个给定的密钥应该只使用一次。
- 因为没有使用链接操作,数据相关性小,所以使得 OFB模式更容易受到攻击。
- 可以使用不同的初始变量产生不同的密钥流,从而使得相同的明文使用不同密钥 产生不同的密文。
- 当每次加密的数据长度取值比较小的时候,相同的明文一般需要更多的循环来完 成加密,这可能会导致过大的开销。
- 每次加密数据的位数应该为8的整数倍。 OFB模式不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位。 OFB模式不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化。
- 每次重新同步的时候,应该使用不同的初始向量。这样可以避免产生相同的密文,从而避免 “已知明文”攻击。
- 在OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了。只要将明文与密钥流进行XOR就可以了。和AES等密码算法相比,XOR运算的速度是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。换个角度来看,生成密钥流的操作和进行XOR运算的操作是可以并行的。
三重分组加密模式
-
上述三种方式的安全性限定于分组长度,比如 DES算法,密钥长度一般来说就是64位,容易受到穷举 攻击
-
OpenSSL常用的有三重电子密码本模式 (3ECB)和三重加密分组链接模式 (3CBC)。
-
三重分组加密模式使用了不止一个密钥,对明文分组进行了基于基本分组加密模式的 加密、解密和加密操作。目前来说,有两种应用方式:一种是使用两个密钥,即第一个密 钥和第三个密钥相同;还有一种就是使用三个不同的密钥。图38所示是使用两个密钥的 三重分组加密模式的加密和解密流程图;图39所示是使用了三个不同密钥的三重分组加 密模式的加密和解密流程图。
三重加密分组模式特点
- 加密过程为使用 K1加密,然后使用 K2解密,最后使用 K3加密完成加密过程。 加密过程使用了电子密码本模式、加密分组链接模式等其他基本分组加密模式,
- 但是密钥增加到了168位,虽然目前理论上可以使得有效密钥长度降到112位,相对于 56位的密钥来说,安全性还是得到了很大的提高。
- 如果前两个密钥是相同的,那么就相当于使用一个密钥加密了一次。
- 如果第一个和第三个密钥是相同的,那么密钥长度事实上是112位,有些攻击方法可以使得有效密钥的长度降为比56位稍多的长度,但需要很大的内存空间。 如果三个密钥都是相同的,那么就跟普通的分组加密模式效果相同了。
- 三重分组加密模式的基本特点跟其使用的基本分组加密模式特点基本一致。
其他分组加密模式
计数器模式:
-
在输出反馈模式中,移位寄存器的输入是从加密输出分组中最左端的值取出的。计数 器模式跟这种模式不同的是移位寄存器的输出是一个计数器,每一个分组完成加密后,计数器要增加某一个常数。计数器模式跟输出反馈模式一样没有错误扩散的特点,但是也同 样没有同步错误恢复功能。
分组链接模式
-
分组链接模式将分组密码算法的输入与前面所有密文分组的异或值相异或。分组链接模式也需要一个初始向量,具有密文错误扩散的性质。
其他
- 还有很多其他的分组加密模式,比如扩散密码分组链接模式、带校验和的密码分组链 接,等等,其基本原理跟前面介绍的分组加密模式相似