标题:对称块加密算法加密模式详解
作者:DragonKing
Email: wzhah@263.net
原发网站:中国openssl专业论坛 [url=http://openssl.126.com][color=#0000FF]http://openssl.126.com[/color][/url]
版权声明:未经作者允许,不能转载和在出版物中使用本文
在openssl或其他密码相关的资料中,我们经常看到对称加密算法有ECB、CBC之类加密模式的简称,到底这些加密模式是什么呢?它们之间有什么不同呢,今天就是为大家解开这个迷。
在现有的对称加密算法中,主要有4种加密处理模式,这4种加密处理模式一般是针对块加密算法而言的,如DES算法。这4种加密模式罗列如下:
模式中文描述 英文名称(Openssl缩写)
电子密码本模式 Electronic Code Book(ECB)
加密块链模式 Cipher Block Chaining(CBC)
加密反馈模式 Cipher Feedback Mode(CFB)
输出反馈模式 Output Feedback Mode(OFB)
下面我们分别介绍这4种加密模式。
**********************************************************************
[color=#FF0000]【电子密码本模式】[/color]
这种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。比如DES算法,一个64位的密钥,如果采用该模式加密,就是将要加密的数据分成每组64位的数据,如果最后一组不够64位,那么就补齐为64位,然后每组数据都采用DES算法的64位密钥进行加密。下图:
_______________________
My name |is Drago|nKing
———————–
上图“My name is DragonKing”这句话每8个字符(64位)作为一块,然后使用一个相同的64位的密钥对每个块进行加密,最后一块不足64位,就补齐后再进行加密。
可以看到,因为ECB方式每64位使用的密钥都是相同的,所以非常容易获得密文进行密码破解,此外,因为每64位是相互独立的,有时候甚至不用破解密码,只要简单的将其中一块替换就可以达到黑客目的。
[color=#FF0000]【加密块链模式】[/color]
从这两个图中大家可以看到,CBC模式的加密首先也是将明文分成固定长度(64位)的块(P0,P1…),然后将前面一个加密块输出的密文与下一个要加密的明文块进行XOR(异或)操作计算,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始化向量(IV)。跟ECB方式不一样,通过连接关系,使得密文跟明文不再是一一对应的关系,破解起来更困难,而且克服了只要简单调换密文块可能达到目的的攻击。
但是该加密模式的缺点是不能实时解密,也就是说,必须等到每8个字节都接受到之后才能开始加密,否则就不能得到正确的结果。这在要求实时性比较高的时候就显得不合适了。所以才有了下面两种加密模式。
[color=#FF0000]【加密反馈模式】[/color]
加密反馈模式为了克服必须等待8个字节全部得到才能进行解密的缺点,采用了一个64位(8个字节)的位移寄存器来获得密文,如下图所示:
上面两个图中C2、C3以及P10等都是一个字节(8位)的数据,所以能够实现字符的实时加密和解密,不用再等到8个字节都接受到之后再进行解密。图示是在进行第10个字节数据的加密和解密过程,在该过程中,先从移位寄存器取8个字节的数据(C2到C9)用密钥进行加密,然后取加密数据最左边的一个字节跟输入的明文P10进行XOR(异或)操作,得到的值作为输出密文C10,同时将C10送入到移位寄存器中。
需要注意的是,如果其中有一个字节的密文在传输的时候发生错误(即使是其中的一位),那么它出现在移位寄存器期间解密的8个字节的数据都会得不到正确的解密结果,当然,这8个字节过去之后,依然可以得到正确的解密结果。但是一个比特错误就影响到8个字节(64个比特)的正确结果,导致鲁棒性太差,所以就又提出了下面的加密模式OFB。
[color=#FF0000]【输出反馈模式】[/color]
输出反馈模式OFB跟CFB几乎是一样的,除了其以为寄存器的输入数据稍微有一点不同之外,如下图:
可以看到,这种方法因为没有采用密文作为加密的数据,所以克服了由于传输过程中由于单个比特导致64个相关比特解密失败的情况,在本模式下,如果一个比特发生错误了,那么只会影响其本身对应的一个比特,而不会影响别的。但是相对于其它模式,因为数据之间相关性小,这种加密模式是比较不安全的,所以在应用的时候除非特别需要,一般不提倡应用OFB模式。
原文地址 [url=http://hi.baidu.com/msingle/blog/item/e9d7cd455e02ed25cffca3a6.html][color=#0000FF]http://hi.baidu.com/msingle/blog/item/e9d7cd455e02ed25cffca3a6.html [/color] [/url]
其他的一些补充:
■ 缩写说明 ■
IN - 输入向量
OUT - 输出向量(未用于和明文加密前)
ENC - 加密算法
K - 加密密钥
P - 明文
C - 密文
XOR - 异或
<< - 左移
BSIZE - 算法的加密块尺寸
COUNT - 计数器
——————————————————————————
计数器(CTR)模式: IN(N) = ENC(K, COUNT++), C(N) = IN(N) XOR P(N);CTR 模式被广泛用于 ATM 网络安全和 IPSec应用中,相对于其它模式而言,CRT模式具有如下特点:
■ 硬件效率:允许同时处理多块明文 / 密文。
■ 软件效率:允许并行计算,可以很好地利用 CPU 流水等并行技术。
■ 预处理: 算法和加密盒的输出不依靠明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,这将极大地提高吞吐量。
■ 随机访问:第 i 块密文的解密不依赖于第 i-1 块密文,提供很高的随机访问能力
■ 可证明的安全性:能够证明 CTR 至少和其他模式一样安全(CBC, CFB, OFB, …)
■ 简单性:与其它模式不同,CTR模式仅要求实现加密算法,但不要求实现解密算法。对于 AES 等加/解密本质上不同的算法来说,这种简化是巨大的。
■ 无填充,可以高效地作为流式加密使用。
——————————————————————————
密文块链接(CBC)模式:IN(N) = P(N) XOR C(N-1), C(N) = ENC(K, IN(N));在 CTR出现前广泛使用的块加密模式,用于安全的分组(迭代式)加密和认证。
——————————————————————————
密文反馈 (CFB) 模式: IN(N) = C(N-1) << (BSIZE-j), C(N) = ENC(K, IN(N)) << (BSIZE-j) XOR P(N). 其中 j 为每次加密的位数。CFB 模式与 CBC 模式原理相似,但一次仅处理 j 位数据,其余 BLOCKSIZE - j 位丢弃。由于以上性质,CFB 模式可以在不损失安全性的前提下,将块加密变为流式加密。但是该模式也是比较浪费的,因为在每轮加解密中都丢弃了大部分结果(j 通常为一字节(8 位),块加密算法中每块的尺寸通常为64、128 或 256 位不等)。
——————————————————————————
输出反馈 (OFB) 模式:IN(N) = OUT(N-1) << (BSIZE-j), C(N) = ENC(K, IN(N)) << (BSIZE-j) XOR P(N), OUT(N) = ENC(K, IN(N)) << (BSIZE-j). 该模式与 CFB 模式基本相同,只不过本次输入是上次迭代中尚未与明文异或时的输出。 与 CFB 模式一样, OFB 模式也可以作为流加密模式使用,除此之外,由于每次迭代的输入不是上次迭代的密文,从而保证了较强的容错能力, 即: 对一块(一字节)密文的传输错误不会影响到后继密文。但是,由于输入没有经过密文叠加使得其抗篡改攻击的能力较差,通常需要与消息验
证算法或数字签名算法配套使用。OFB 通常用于噪音水平较高的通信连接以及一般的流式应用中。
——————————————————————————
电码本(ECB)模式: IN(N) = P(N), C(N) = ENC(K, IN(N)). 最简单但最不安全的加密方式。每次迭代的输入都使用相同密钥进行无变换的直接加密。对于同样的明文片断,总会产生相同的,与之对应的密文段。抗重复统计和结构化分析的能力较差。一次性加密的最坏情况 (即:每次输入的明文都小于等于 BSIZE 时) 就是电码本模式。 仅在一次一密,或传出极少数据时考虑使用 ECB 模式。
太强大了 ··