发布时间:2016-3-23 15:56
分类名称:PKI
下文,为汇总网络上各个博客文章。
这是一个加密算法的大致分类图:
对称加密又分为分组加密和序列密码。
本文介绍的是分组密码算法。
分组密码算法是提供数据安全的基本构件。它以固定的分组长度作为基本的处理单元,但要加密的消息的长度可能要长得多。
为了将分组密码算法应用于实际,人们定义了很多工作模式。
例如:DES只解决了如何对一个64比特的明文分组进行加密保护的问题,对于比特殊不等于64比特的明文如何加密,并不关心。这个问题,就由分组密码的工作模式来解决。
分组密码的工作模式是:根据不同的数据格式和安全性要求, 以一个具体的分组密码算法为基础构造一个分组密码系统的方法。分组密码的工作模式应当力求简单, 有效和易于实现。
在分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。
电码本模式(ECB)electronic codebook mode是最简单的模式,它直接利用加密算法分别对每个64位明文分组使用相同的64位密钥进行加密。
对于长于64位的报文,整个加密前需要把这个报文分成64位的分组,如果有必要的话对最后一个组做填充。
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明文块,大小为64bit;
Ci ( i = 0,1…n)是密文块,大小为64bit;
ECB加密算法可表示为:
Ci = Enc(Key, Pi)
ECB解密算法可以表示为:
Pi = Dec(Key,Ci)
使用 " 密码本 " 这个术语的原因是对每个64位的明文分组就有一个唯一的密文,因此可以想象一个巨大的密码本,其中对每一个可能的64位明文项就有一个密文项与之对应。
ECB加密
ECB解密
算法 特点:
优点:
1.简单;
2.有利于并行计算;
3.误差不会被传送,一个错误仅仅会对一个密文块产生影响;
缺点:
1.不能隐藏明文的模式;repetitions in message may show in cipher text/在密文中出现明文消息的重复;
2.可能对明文进行主动攻击,相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
在ECB模式下,加密算法的输入是明文,算法的输出将直接作为密文进行输出,不进行任何形式的反馈,每个明文分组的处理是相互独立的,这种方式也是分组密码工作的标准模式。
ECB模式的缺点是:在给定密钥k 下,同一明文组总是产生同一密文组,这会暴露明文组的数据格式。某些明文的数据格式会使得明文组有大量的重复或较长的零串,一些重要的数据常常会在同一位置出现,特别是格式化的报头、作业号、发报时间、地点等特征都将被泄露到密文之中,使攻击者可以利用这些特征。
该模式好的一面就是用同个密钥加密的单独消息,其结果是没有错误传播。实际上,每一个分组可被看作是用同一个密钥加密的单独消息。密文中数据出了错,解密时,会使得相对应的整个明文分组解密错误,但它不会影响其他明文。然而,如果密文中偶尔丢失或添加一些数据位,那么整个密文序列将不能正确的解密。除非有某帧结构能够重新排列分组的边界。
如上所述,ECB 工作模式存在一些显见的缺陷。为了克服这些缺陷, 我们应用分组密码链接技术来改变分组密码的工作模式。
CBC 工作模式是在密钥固定不变的情况下,改变每个明文组输入的链接技术。在CBC 模式下,每个明文组mi 在加密之前, 先与反馈至输入端的前一组密文ci?1逐比特异或后再加密。
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明文块,大小为64bit;
Ci ( i = 0,1…n)是密文块,大小为64bit;
XOR(X,Y)是异或运算;
IV是初始向量(一般为64位);
ECB加密算法可表示为:
C0 = Enc(Key, XOR(IV, P0)
Ci = Enc(Key, XOR(Ci-1, Pi)
ECB解密算法可以表示为:
Pi = XOR(Ci-1, Dec(Key,Ci))
P0 = XOR(IV, Dec(Key, C0))
CBC加密
这样, 密文组ci 不仅与当前的明文组有关,而且通过反馈的作用还与以前的明文组m1, m2,...mi.1 有关。这从密码学的本质上来说是一种混淆操作。
CBC解密
算法特点:
优点:
1.可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击; 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
1.密文块要依赖以前的操作结果,所以,密文块不能进行重新排列,无法并行计算; (在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化) 。
2. 需要初始化向量IV
3. 会出现错误传播(errorpropagation). 密文中任一位发生变化会涉及后面一些密文组. 但CBC 模式的错误传播不大, 一个传输错误至多影响两个消息组的接收结果 (思考).
关于错误传播的问题,我的理解是这样的。因为分组密码模式的分组特性导致了这一现象。每个组之间是独立的。所以如果在传输中即使有某一位发生了错误,也仅仅可以理解为某一组发生了错误,对其他组没有影响。
比如A组发生了位错乱,它最多影响到当前A这组明文和下一组B明文。而再下一组C就不受影响了,因为C组是根据B的密文作为输入的,但是B分组的位并没有发生错误,所以在CBC模式下错误传播最多持续2个分组
分组密码算法也可以用于同步序列密码,就是所谓的密码反馈(Cipher-FeedBack, CFB)模式。在CBC 模式下,整个数据分组在接收完之后才能进行加密。对许多网络应用来说,这是个问题。例如,在一个安全的网络环境中,当从某个终端输入时,它必须把每一个字符马上传输给主机。当数据在字节大小的分组里进行处理时,CBC 模式就不能做到了。若待加密的消息必须按字符比特处理时,可采用CFB 模式。
加密反馈模式克服了需要等待8个字节才能加密的缺点,它采用了分组密码作为流密码的密钥流生成器;
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明文块,大小为64bit;
Ci ( i = 0,1…n)是密文块,大小为64bit;
Si ( i = 0,1…n),大小为8bit,n个连续的Si组成加密位移寄存器,一般n=8;
Oi = Enc(Key, Si);
Lef(x) 为取数据x的最左8个bit位;
A(x,y)为合并x左移8位,空位用y填充
CFB加密算法可表示为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Ci);
CFB解密算法可表示为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Ci);
在CFB 模式下,每次加密s bit 明文。(1<= s<= 原来的固有长度):
s = 8, L = 64/s
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与明文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。
这个流程描述有些不清楚,下面贴了一段AES CFB8加解密的流程:
int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
int mode,
size_t length,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output )
{
unsigned char c;
unsigned char ov[17];
while( length-- )
{
memcpy( ov, iv, 16 );
mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
ov[16] = *input;
c = *output++ = (unsigned char)( iv[0] ^ *input++ );
ov[16] = c;
memcpy( iv, ov + 1, 16 );
}
return( 0 );
}
特点:
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算; 与CBC类似,解密过程是可以并行化的
2.误差传送:一个明文单元损坏影响多个单元;
3.唯一的IV;
在CFB模式中,1位密文的传输错误会影响至少b+1位的明文,这种错误传播的影响对于有些应用来讲还是太大了。与CFB模式不同之处在于, 加密位移寄存器与密文无关了,仅与加密key和加密算法有关。做法是不再把密文输入到加密移位寄存器,而是把输出的分组密文(Oi)输入到一位寄存器;
从而克服了CBC和CFB模式带来的错误传播问题
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明文块,大小为64bit;
Ci ( i = 0,1…n)是密文块,大小为64bit;
Si ( i = 0,1…n),大小为8bit,n个连续的Si组成加密位移寄存器,一般n=8;
Oi = Enc(Key, Si);
Lef(x) 为取数据x的最左8个bit位;
A(x,y)为合并x左移8位,空位用y填充
CFB加密算法可表示为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Oi); 注意这里与CFB模式的不同
CFB解密算法可表示为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Oi);
OFB模式实质上就是一个同步流密码,通过反复加密一个初始向量IV来得到密钥流。这种方法有时也叫"内部反馈",因为反馈机制独立于明文和密文而存在的。
OFB 模式克服了CBC 模式和CFB 模式的错误传播带来的问题, 但同时也带来了序列密码具有的缺点,对密文被篡改难于进行检测。
(关于难于检测错误的问题我的理解是:防止错误传播和错误检测本来就是矛盾的,因为之所以能检测到错误,就是因为发生了错误传播,然后通过hash机制检测出错误。但是OFB能防止错误传播,即无法检测到错误传播,也就自然无法检测密文篡改等错误了)
由于 OFB 模式多在同步信道中运行, 对手难于知道消息的起始点而使这类主动攻击不易奏效。
OFB 模式不具有自同步能力, 要求系统保持严格的同步, 否则难于解密。OFB 模式的初始向量IV 无需保密, 但各条消息必须选用不同的IV。
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
特点:
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.对明文的主动攻击是可能的;
3.误差传送:一个明文单元损坏影响多个单元;
CBC模式和和CFB模式都存在这样一个问题:不能以随机顺序来访问加密的数据,因为当前密文数据块的解密依赖于前面的密文块。而这个问题对于很多应用来说,特别是数据库的应用,是很难接收的。为此,又出现了另一种操作模式,即CRT模式。
与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证不产生长时间重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。
CTR本质上和OFB很类似,只不过差别在与OFB中的密钥流是逐级反馈的。但是在CTR中,密钥流的产生之间是没有关联的,而是由计数器CTR来提供。
注意图中的"nonce(随机数)"与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同平文产生不同的密文。
CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。
CTR模式的主要有点如下:
1)随机访问性。可以随机地对任意一个密文分组进行解密,对该密文分组的处理与其他密文无关。
2)高效率
3)CTR可以处理任意长度的数据,只要相应调整CTR产生的密钥长度即可。而且加解密过程是对称的XOR。
3. 不同模式的特点和用途
ECB 模式适用于对字符加密, 例如, 密钥加密。
OFB 模式常用于卫星通信中的加密。
由于对 CBC 和CFB 模式当改变一个明文分组xi则yi 与其后所有密文分组都会受到影响, 这一性质说明这两种模式都可用于认证系统。更明确的说, 这些模
式能被用来产生一个消息认证码, 即MAC。它能使消息接收方相信给定的明文序列的确来自合法发送者,而没有被篡改。这再次说明技术的两面性。
4. 其它模式和密码学概念
除了上文中提到的模式以外,还有很多其它的块密码工作模式。有的被公众所接受,有其详细描述了,甚至被标准化了,并在使用中;而有的则被认为是不安全的,而从未使用过;另外一些则并没有被分类为保密,认证或签名加密,例如密钥反馈模式(KFM,Key Feedback Mode)和AES-hash。NIST维护着一张块密码工作模式列表[23][24]。
磁盘加密通常使用特殊目的、专门设计的模式。可以调节的小数据块加密模式(LRW,XEX和XTS)和大数据块的模式(CMC和EME)是设计用于加密磁盘区块的。
块密码也可以用于其它加密协议中,在这些协议中,块密码的使用方式与前述工作模式相似。在一切协议中,为了保证其安全性,必须在构建工作模式时特别注意。
消息认证码(MAC)通常由块密码得到,例如CBC-MAC,OMAC和PMAC。
认证加密也采用块密码作为其中的一部,其同时使用加密和MAC以提供保密性和数据完整性,例如IAPM,CCM,CWC,EAX,GCM和OCB。
5. 总评:
(1)ECB模式简单、高速,但最弱,易受重发和替换攻击,一般不采用。
(2)CBC,CFC,OFB模式的选用取决于实际的特殊需求。
(3)明文不易丢信号,对明文的格式没有特殊要求的环境可选用CBC模式。需要完整性认证功能时也可选用该模式。
(4)容易丢信号的环境,或对明文格式有特殊要求的环境,可选用CFB模式。
(2)不易丢信号,但信号特别容易错,但明文冗余特别多,可选用OFB模式