分组密码的工作模式

一、理论基础

1.概述

密码学中,块密码的工作模式允许使用同一个块密码密钥对多于一块的数据进行加密,并保证其安全性。块密码自身只能加密长度等于密码块长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到符合密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。

工作模式主要用来进行加密和认证。对加密模式的研究曾经包含数据的完整性保护,即在某些数据被修改后的情况下密码的误差传播特性。后来的研究则将完整性保护作为另一个完全不同的,与加密无关的密码学目标。部分现代的工作模式用有效的方法将加密和认证结合起来,称为认证加密模式。

虽然工作模式通常应用于对称加密,它亦可以应用于公钥加密,例如在原理上对RSA进行处理,但在实用中,公钥密码学通常不用于加密较长的信息,而是使用混合加密方案。

2.历史和标准化

最早出现的工作模式,ECB,CBC,OFB和CFB可以追溯到1981年。2001年,NIST修订了其早先发布的工作模式工作列表,加入了AES,并加入了CTR模式。最后,在2010年1月,NIST加入了XTS-AES,而其余的可信模式并没有为NIST所认证。例如CTS是一种密文窃取的模式,许多常见的密码学运行库提供了这种模式。

ECB,CBC,OFB,CFB,CTR和XTS模式仅仅提供了机密性;为了保证加密信息没有被意外修改或恶意篡改,需要采用分离的消息验证码,例如CBC-MAC。密码学社群认识到了对专用的保证完整性的方法的需求,NIST因此提出了HMAC,CMAC和GMAC。HMAC在2002年通过了认证,CMAC在2005年通过,GMAC则在2007年被标准化。

在发现将认证模式与加密模式联合起来的难度之后,密码学社区开始研究结合了加密和认证的单一模式,这种模式被称为认证加密模式(AE,Authenticated Encryption),或称为authenc。AE模式的例子包括CCM,GCM,CWC,EAX,IAPM和OCB。

现在,工作模式为许多国家和国内的标准认证实体所定义,其中最有影响力的来源是美国的NIST,而其它有影响力的组织包括ISO,IEC,IEEE,美国的ANSI,以及IETF。

3.初始化向量(IV)

初始化向量(IV,Initialization Vector)是许多工作模式中用于随机化加密的一块数据,因此可以由相同的明文,相同的密钥产生不同的密文,而无需重新产生密钥,避免了通常相当复杂的这一过程。

初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。对于CBC和CFB,重用IV会导致泄露平文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。

4.填充 (密码学)

块密码只能对确定长度的数据块进行处理,而消息的长度通常是可变的。因此部分模式(即ECB和CBC)需要最后一块在加密前进行填充。有数种填充方法,其中最简单的一种是在平文的最后填充空字符以使其长度为块长度的整数倍,但必须保证可以恢复平文的原始长度;例如,若平文是C语言风格的字符串,则只有串尾会有空字符。稍微复杂一点的方法则是原始的DES使用的方法,即在数据后添加一个1位,再添加足够的0位直到满足块长度的要求;若消息长度刚好符合块长度,则添加一个填充块。最复杂的则是针对CBC的方法,例如密文窃取,残块终结等,不会产生额外的密文,但会增加一些复杂度。布鲁斯·施奈尔和尼尔斯·弗格森提出了两种简单的可能性:添加一个值为128的字节(十六进制的80),再以0字节填满最后一个块;或向最后一个块填充n个值均为n的字节。

CFB,OFB和CTR模式不需要对长度不为密码块大小整数倍的消息进行特别的处理。因为这些模式是通过对块密码的输出与平文进行异或工作的。最后一个平文块(可能是不完整的)与密钥流块的前几个字节异或后,产生了与该平文块大小相同的密文块。流密码的这个特性使得它们可以应用在需要密文和平文数据长度严格相等的场合,也可以应用在以流形式传输数据而不便于进行填充的场合。

二、分组工作模式

1.电子密码本(ECB)

最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。

Ecb encryption.png

Ecb decryption.png

本方法的缺点在于同样的平文块会被加密成相同的密文块;因此,它不能很好的隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议中。下面的例子显示了ECB在密文中显示平文的模式的程度:该图像的一个位图版本(左图)通过ECB模式可能会被加密成中图,而非ECB模式通常会将其加密成右图。

Tux.jpg  Tux ecb.jpg  Tux secure.jpg
原图                           使用ECB模式加密       提供了伪随机性的非ECB模式

右图是使用CBC,CTR或任何其它的更安全的模式加密左图可能产生的结果—与随机噪声无异。注意右图看起来的随机性并不能表示图像已经被安全的加密;许多不安全的加密法也可能产生这种“随机的”输出。

ECB模式也会导致使用它的协议不能提供数据完整性保护,易受到重放攻击的影响,因此每个块是以完全相同的方式解密的。例如,“梦幻之星在线:蓝色脉冲”在线电子游戏使用ECB模式的Blowfish密码。在密钥交换系统被破解而产生更简单的破解方式前,作弊者重复通过发送加密的“杀死怪物”消息包以非法的快速增加经验值。

2.密码块链接(CBC)

1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个平文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有平文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

Cbc encryption.png

Cbc decryption.png

若第一个块的下标为1,则CBC模式的加密过程为
C_i = E_K(P_i \oplus C_{i-1}), C_0 = IV

而其解密过程则为

P_i = D_K(C_i) \oplus C_{i-1}, C_0 = IV
CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。解决后一个问题的一种方法是利用密文窃取。

注意在加密时,平文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的平文块和下一个平文块中对应位发生改变,不会影响到其它平文的内容。

3.填充密码块链接(PCBC)

填充密码块链接(PCBC,Propagating cipher-block chaining)或称为平文密码块链接(Plaintext cipher-block chaining),是一种可以使密文中的微小更改在解密时导致平文大部分错误的模式,并在加密的时候也具有同样的特性。

Pcbc encryption.png

Pcbc decryption.png

加密和解密算法如下:
C_i = E_K(P_i \oplus P_{i-1} \oplus C_{i-1}), P_0 \oplus C_0 = IV
P_i = D_K(C_i) \oplus P_{i-1} \oplus C_{i-1}, P_0 \oplus C_0 = IV
PCBC主要用于Kerberos v4和WASTE中,而在其它场合的应用较少。对于使用PCBC加密的消息,互换两个邻接的密文块不会对后续块的解密造成影响。正因为这个特性,Kerberos v5没有使用PCBC。

4.密文反馈(CFB)

密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
C_i = E_K (C_{i-1}) \oplus P_i
P_i = E_K (C_{i-1}) \oplus C_i
C_{0} = \ \mbox{IV}

Cfb encryption.png

Cfb decryption.png

上述公式是描述的是最简单的CFB,在这种模式下,它的自同步特性仅仅与CBC相同,即若密文的一整块发生错误,CBC和CFB都仍能解密大部分数据,而仅有一位数据错误。若需要在仅有了一位或一字节错误的情况下也让模式具有自同步性,必须每次只加密一位或一字节。可以将移位寄存器作为块密码的输入,以利用CFB的自同步性。

为了利用CFB制作一种自同步的,可以处理任意位情况错误的流密码,需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。

下式中Si是移位寄存器的第i个状态,a << x是指将a移位x位,head(a, x)是指a的高x位,n则是指IV的位数。
C_i = \mbox{head}(E_K (S_{i-1}), x) \oplus P_i
P_i = \mbox{head}(E_K (S_{i-1}), x) \oplus C_i
S_i = \ ((S_{i-1} << x) + C_i) \mbox{ mod } 2^n
S_{0} = \ \mbox{IV}
若密文的x位发生错误,则密码在移位寄存器恢复与加密时的状态相同之前,输出不正确的结果,而当寄存器状态恢复后,密码即可以重新同步,恢复正常输出,因此最多只有一块数据发生错误。

与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。在解密时,密文中一位数据的改变仅会影响两个平稳块:对应平文块中的一位数据与下一块中全部的数据,而之后的数据将恢复正常。

CFB拥有一些CBC所不具备的特性,这些特性与OFB和CTR的流模式相似:只需要使用块密码进行加密操作,且消息无需进行填充(虽然密文窃取也允许数据不进行填充)。

5.输出反馈(OFB)

输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。

由于XOR操作的对称性,加密和解密操作是完全相同的:
C_i = P_i \oplus O_i
P_i = C_i \oplus O_i
O_i = \ E_K (O_{i-1})
O_{0} = \ \mbox{IV}

Ofb encryption.png

Ofb decryption.png

每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。

可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。

6.计数器模式(CTR)

注意:CTR模式(Counter mode,CM)也被称为ICM模式(Integer Counter Mode,整数计数模式)和SIC模式(Segmented Integer Counter)。
与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证不产生长时间重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。使用简单的、定义好的输入函数是有争议的:批评者认为它“有意的将密码系统暴露在已知的、系统的输入会造成不必要的风险”。目前,CTR已经被广泛的使用了,由输入函数造成的问题被认为是使用的块密码的缺陷,而非CTR模式本身的弱点。无论如何,有一些特别的攻击方法,例如基于使用简单计数器作为输入的硬件差错攻击。

CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。

注意图中的“nonce(随机数)”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同平文产生不同的密文。

Ctr encryption.png

Ctr decryption.png

三、扩展内容

1.误差传播

在消息验证码和认证加密的广泛应用之前,常常有人讨论块密码工作模式的“误差传播”特性,作为工作模式性能的一部分。例如,若密文传输中一个数据块的错误会导致采用ECB模式生成的平文中同样一个块的错误,而CBC模式中会导致两个平文块出错。

有人认为这样的特性在应对随机误差(例如传输噪声)时会是有益的,而还有人认为这样的特性使得攻击者更容易篡改消息的一部分。

无论如何,若使用了适当的完整性保护措施,这样的误差很可能会导致整个消息重发。若需要应对随机误差,则应当在发送密文之前增加错误校正码。

2.认证加密

一些工作模式在设计中希望将保密性和认证性结合起来,例如XCBC,ACBC,APM,OCB,EAX,CWC,CCM和GCM。认证加密模式被可以分为单次处理和两次处理两种类型。然而,对密码学用户社群而言,不幸的是,许多单次处理的认证加密算法,例如OCB,是为专利所保护的。

另外,有的模式也允许为未加密的关联数据进行认证,因此被称为AEAD(Authenticated-Encryption with Associated-Data,用于关联数据的认证加密)。例如,EAX是一种两次处理的AEAD方法,而OCB模式是单次的。

3.其它模式和密码学概念

除了上文中提到的模式以外,还有很多其它的块密码工作模式。有的被公众所接受,有其详细描述了,甚至被标准化了,并在使用中;而有的则被认为是不安全的,而从未使用过;另外一些则并没有被分类为保密,认证或签名加密,例如密钥反馈模式(KFM,Key Feedback Mode)和AES-hash。NIST维护着一张块密码工作模式列表。

磁盘加密通常使用特殊目的、专门设计的模式。可以调节的小数据块加密模式(LRW,XEX和XTS)和大数据块的模式(CMC和EME)是设计用于加密磁盘区块的。

块密码也可以用于其它加密协议中,在这些协议中,块密码的使用方式与前述工作模式相似。在一切协议中,为了保证其安全性,必须在构建工作模式时特别注意。

有数种方法可以用块密码构建密码散列函数,参见单向压缩函数。

消息认证码(MAC)通常由块密码得到,例如CBC-MAC,OMAC和PMAC。

认证加密也采用块密码作为其中的一部,其同时使用加密和MAC以提供保密性和数据完整性,例如IAPM,CCM,CWC,EAX,GCM和OCB。

转自:http://blog.163.com/kevinlee_2010/blog/static/16982082020113853451308/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PBOC3.0中使用的国密SM2算法

一、知识准备 PBOC3.0规范就是《中国金融集成电路&#xff08;IC&#xff09;卡规范》3.0版本。SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法。本身是基于ECC椭圆曲线算法的&#xff0c;所以要讲SM2, 先要弄懂ECC。 完全理解ECC算法需要一定的数学功底…

Markdown入门

Markdown 是一种轻量级的「标记语言」&#xff0c;它的优点很多&#xff0c;目前也被越来越多的写作爱好者&#xff0c;撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑&#xff0c;Markdown 的语法十分简单。常用的标记符号也不超过十个&#xff0c;这种相对于更为…

mysql数据库支持emoji表情的详解

mysql存储emoji表情的时候&#xff0c;就会报错&#xff0c;如下&#xff1a; Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8A\xF0\x9F…’ for column ‘这是我表中的字段’ at row 1 初步定位是我的数据库是utf8编码…

编程规范:长函数的思考

在工作&#xff0c;我们应该都不想看到非常的长函数。对于一个运行5年左右的项目&#xff0c;极有可能出现这种情况。由于长函数的长、if/else嵌套&#xff0c;导致代码的可读性非常差&#xff0c;这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…

用redis实现延迟队列

现在在用的redis实现延迟队列的主流程

maven更新快照不起作用的解决方法

问题&#xff1a;maven的快照包更新后&#xff0c;调用方使用idea点下面这个地方更新maven&#xff0c;并没有拉到最新的快照 解决方法1 删除本地仓库的快照包&#xff0c;再重新拉一次 解决方法2 下图&#xff0c;这里点进去 下图&#xff0c;这个勾上就行了&#xff0c;再…

iOS中frame和Bounds之间的区别

frame frame是每个view必备的属性&#xff0c;代表的是当前视图的位置和大小&#xff0c;没有设置他&#xff0c;当前视图是看不到的。位置需要有参照物才能确定&#xff0c;数学中我们用坐标系来确定坐标系中的某个点的位置&#xff0c;iOS中有他特有的坐标系&#xff0c;如下…

[数据库]-----记一次mysql分库的操作(冷热分离)

前提: 1.原有库是mysql数据库,已经根据用户pin分片 2.每片是一主两从 3.主表已经分过表了 4.数据库所在服务器为4C8G 5.库中数据量已经超过千万,而且以每天3万多的数据持续增长,将来每天或许会更多 6.库内数据为订单数据&#xff0c;每时每刻都有新的订单产生&#xff0c;每个…

iOS网络请求认证挑战

一、引言 Http请求中认证挑战相关的代理如下&#xff1a; 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge:2.是否能够对一个保护空间进行认证&#xff08;已废弃&#xff09;- connection:canAuthenticateAgainstProtectionSpace:3.…

CDN的实现原理

一、传统模式 在描述CDN的实现原理前&#xff0c;让我们先看传统的未加缓存服务的访问过程&#xff0c;以便了解CDN缓存访问方式与未加缓存访问方式的差别&#xff1a; 用户提交域名→浏览器对域名进行解释→得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复…

一个简单的权限系统模型

我们知道&#xff0c;一般说的简单的权限系统&#xff0c;都是使用shiro或者spring-security shiro之前用的比较多&#xff0c;原理也容易理解&#xff0c;算是比较成熟的权限方面的框架spring-security相对源码比较难懂&#xff0c;但由于与spring的完美融合&#xff0c;也有…

获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表

转载自&#xff1a;http://blog.csdn.net/jasonblog/article/details/49909163 如果要获取当前线程的调用栈&#xff0c;可以直接使用现有API&#xff1a;[NSThread callStackSymbols]。 但是并没有相关API支持获取任意线程的调用栈&#xff0c;所以只能自己编码实现。 1. 基础…

获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构

我们知道Windows下的文件都是PE文件&#xff0c;同样在OS X和iOS中可执行文件是Mach-o格式的。 所以我们如果要进行逆向分析&#xff0c;首先要熟悉Mach-o文件结构。 Mach-o包含三个基本区域&#xff1a; 头部&#xff08;header structure&#xff09;。 加载命令&#xff08;…

获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名

下面来讲讲如何从Mach-o文件中分析出类名和方法名&#xff0c;也让我们了解下class-dump的原理。 Mach-o结构有两个节&#xff1a;__objc_classname 和 __objc_methname 其中就是类名和方法名。 其中__objc_classname的偏移为&#xff1a;ox7961 __objc_methname的偏移为0x6…

获取iOS任意线程调用堆栈(四)符号化实战

转载自&#xff1a;http://blog.csdn.net/jasonblog/article/details/49909209 1. 相关API和数据结构 由于我们在上面回溯线程调用栈拿到的是一组地址&#xff0c;所以这里进行符号化的输入输出应该分别是地址和符号&#xff0c;接口设计类似如下&#xff1a; - (NSString *)s…

获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger

转载自&#xff1a;https://toutiao.io/posts/aveig6/preview BSBacktraceLogger 是一个轻量级的框架&#xff0c;可以获取任意线程的调用栈&#xff0c;开源在我的 GitHub&#xff0c;建议下载下来结合本文阅读。 我们知道 NSThread 有一个类方法 callstackSymbols 可以获取调…

Mac电脑如何彻底删除清除数据?CleanMyMac X软件更专业

虽然不用杀毒&#xff0c;但是日常的清理还是有必要的&#xff0c;特别是卸载一些软件会有残留&#xff0c;可以用命令mdfind来找&#xff0c;然后删&#xff0c;这里给新手用户推荐一款应用clean my mac x&#xff0c;定期清理一下&#xff0c;不用的时候关掉就可以。 CleanM…

Git的思想和基本工作原理

转载自&#xff1a;http://www.nowamagic.net/academy/detail/48160210# 在开始学习 Git 的时候&#xff0c;请不要尝试把各种概念和其他版本控制系统&#xff08;诸如 Subversion 和 Perforce 等&#xff09;相比拟&#xff0c;否则容易混淆每个操作的实际意义。Git 在保存和处…

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

本文转自&#xff1a;http://www.aboutyun.com/thread-9341-1-1.html一、入门1、简介Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性&#xff0c;但是在设计实现上完全不同&#xff0c;此外它并不是JMS规范的实现。kafka对消息保存…

深入理解Hadoop集群和网络

云计算和Hadoop中网络是讨论得相对比较少的领域。本文原文由Dell企业技术专家Brad Hedlund撰写&#xff0c;他曾在思科工作多年&#xff0c;专长是数据中心、云网络等。文章素材基于作者自己的研究、实验和Cloudera的培训资料。 本文将着重于讨论Hadoop集群的体系结构和方法&am…