理解分组密码


在密码学中,分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。分组加密是极其重要的加密协议组成,其中典型的如AES和3DES作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转帐,非常广泛。
现代分组加密创建在迭代的思想上产生密文。其思想由克劳德·香农在他1949年的重要论文《保密系统的通信理论》(Communication Theory of Secrecy Systems)中提出,作为一种通过简单操作如替代和排列等以有效改善保密性的方法。迭代产生的密文在每一轮加密中使用不同的子密钥,而子密钥生成自原始密钥。
DES加密在1977年由前美国国家标准局(今“美国国家标准与技术研究所”)颁布,是现代分组加密设计的基础思想。它同样也影响了密码分析的学术进展。 AES(高级加密标准,Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的 DES,目前已经广为全世界所使用,成为对称密钥算法中最流行的算法之一。
AES加密主要包括两个步骤:密钥扩展和明文加密
密钥扩展:将输入的密钥(16字节、24字节和32字节)进行扩展,根据密钥长度的不同,得到扩展后的密钥进行加密的轮数也不相同。
明文加密:
字节替换:将输入状态的每个字节使用S盒上对应的字节进行替换。
行位移:状态的第一行保持不变。第二行循环左移一个字节,第三行左移两个字节,第四行循环左移三个字节。
列混淆:将每列中的每个字节映射为一个新值,新值由该列中的4个字节通过函数变换得到。
秘钥轮加:将当前分组和扩展密钥的一部分进行按位异或。
分组加密包含两个成对的算法:加密算法E和解密算法D,两者互为反函数。每个算法有两个输入:长度为n位的组,和长度为k位的密钥;两组输入均生成n位输出。将两个算法看作函数,K表示长度为k的密钥(密钥长度),P表示长度为n的分组,P也被表示为明文,C表示密文,则满足条件时成立。
对于任意密钥K,EK(P)是输入的组的一个置换函数,且可逆地落在{0,1}n区间。E的反函数(解密算法)满足条件时成立。
例如,一个分组加密算法使用一段 128 位的分组作为明文,相应输出 128 位的密文;而其转换则受加密算法中第二个输入的控制,也就是密钥k。解密算法类似,使用 128 位的密文和对应的密钥,得到原 128 位的明文。
每一个密钥实际上是选择了n位输入排列的(2^n)!种组合中的一种。大多数的分组密码在在加密算法中会重复使用某一函数进行多轮运算,典型的轮数在4-32次之间,每一轮的函数R使用不同的子密钥Ki,由原密钥生成。
Lucifer一般被认为是第一个现代分组密码,由IBM在1970年代基于霍斯特·费斯妥(Horst Feistel)的工作完成。它的一个修改版本是数据加密标准,被美国政府纳入联邦资料处理标准,并于1976年正式发布,至今仍被广泛应用。
当时设计DES密码的最初目的是为了抵抗某些美国国家安全局(NSA)和IBM知道的密码分析方法,直到1980年代末期,这种被称为差分分析的方法才被毕汉姆(Eli Biham)和萨莫尔(Adi Shamir)独立重新发现。线性分析是另一种方法,NSA在松井充发布这种实验性的密码分析方法之前还并不知道。DES作为早期的分组密码,最早成为密码标准,由于在最初DES并未公布其实现细节,其S盒设计被怀疑包含后门,因此学界对其进行了大量的研究,提高了学界对分组密码的了解,客观上促进了密码学及密码分析的发展,引领了很多密码学和密码分析的研究。另一种分组密码标准高级加密标准(AES)被美国国家标准与技术研究院(NIST)采纳,即将逐渐取代DES目前的位置。
设计安全的分组加密算法,需要考虑对现有密码分析方法的抵抗,如差分分析、线性分析等,还需要考虑密码安全强度的稳定性。此外用软件实现的分组加密要保证每个组的长度适合软件编程(如8、16、32……),尽量避免位置换操作,以及使用加法、乘法、移位等处理器提供的标准指令;从硬件实现的角度,加密和解密要在同一个器件上都可以实现,即加密解密硬件实现的相似性。
在开发中如果有接触到加密,就一定遇到过MD5、DES、Triple DES、AES、RSA等加密方式(这些都叫加密算法),在深入了解加密领域的知识时,除了有加密算法外;还有加密模式(CBC、ECB、CTR、OCF、CFB等),填充模式(NoPadding、PKCS5Padding、PKCS7Padding等)。需要了解一下加密中的加密模式,不同的加密模式对数据加密的安全度不一样。
分组密码有五种工作模式(下文有简述):
1.电码本模式(Electronic Codebook Book,简称ECB):是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。该模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
2.密码分组链接模式(Cipher Block Chaining,简称CBC):是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。该模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
3.计算器模式(Counter,简称CTR):计算器模式不常见,在CTR模式中,有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
4.密码反馈模式(Cipher FeedBack,简称CFB):实际上是一种反馈模式,目的也是增强破解的难度。
5.输出反馈模式(Output FeedBack,简称OFB):实际上是一种反馈模式,目的也是增强破解的难度。
分组密码工作模式
密码学中,分组密码的工作模式(mode of operation)允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到符合密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。
工作模式主要用来进行加密和认证。对加密模式的研究曾经包含数据的完整性保护,即在某些数据被修改后的情况下密码的误差传播特性。后来的研究则将完整性保护作为另一个完全不同的,与加密无关的密码学目标。部分现代的工作模式用有效的方法将加密和认证结合起来,称为认证加密模式。虽然工作模式通常应用于对称加密,它亦可以应用于公钥加密,例如在原理上对RSA进行处理,但在实用中,公钥密码学通常不用于加密较长的信息,而是使用结合对称加密和公钥加密的混合加密方案。
历史和标准化
最早出现的工作模式,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。
初始化向量(IV)
初始化向量(IV,Initialization Vector)是许多任务作模式中用于将加密随机化的一个位块,由此即使同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程。初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。对于CBC和CFB,重用IV会导致泄露明文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。
填充
块密码只能对确定长度的数据块进行处理,而消息的长度通常是可变的。因此部分模式(即ECB和CBC)需要最后一块在加密前进行填充。有数种填充方法,其中最简单的一种是在明文的最后填充空字符以使其长度为块长度的整数倍,但必须保证可以恢复明文的原始长度;例如,若明文是C语言风格的字符串,则只有串尾会有空字符。稍微复杂一点的方法则是原始的DES使用的方法,即在数据后添加一个1位,再添加足够的0位直到满足块长度的要求;若消息长度刚好符合块长度,则添加一个填充块。最复杂的则是针对CBC的方法,例如密文窃取,残块终结等,不会产生额外的密文,但会增加一些复杂度。布鲁斯·施奈尔和尼尔斯·弗格森提出了两种简单的可能性:添加一个值为128的字节(十六进制的80),再以0字节填满最后一个块;或向最后一个块填充n个值均为n的字节。
CFB,OFB和CTR模式不需要对长度不为密码块大小整数倍的消息进行特别的处理。因为这些模式是通过对块密码的输出与明文进行异或工作的。最后一个明文块(可能是不完整的)与密钥流块的前几个字节异或后,产生了与该明文块大小相同的密文块。流密码的这个特性使得它们可以应用在需要密文和明文数据长度严格相等的场合,也可以应用在以流形式传输数据而不便于进行填充的场合。
模式的简介
1、电子密码本(ECB)
最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。


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

原图

使用ECB模式加密

提供了伪随机性的非ECB模式
右图是使用CBC,CTR或任何其它的更安全的模式加密左图可能产生的结果——与随机噪声无异。注意右图看起来的随机性并不能表示图像已经被安全的加密;许多不安全的加密法也可能产生这种“随机的”输出。
ECB模式也会导致使用它的协议不能提供数据完整性保护,易受到重放攻击的影响,因为每个块是以完全相同的方式解密的。例如,“梦幻之星在线:蓝色脉冲”在线电子游戏使用ECB模式的Blowfish密码。在密钥交换系统被破解而产生更简单的破解方式前,作弊者重复通过发送加密的“杀死怪物”消息包以非法的快速增加经验值。
2、密码块链接(CBC)
1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。



CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。解决后一个问题的一种方法是利用密文窃取。
注意在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
填充密码块链接(PCBC)
填充密码块链接(PCBC,Propagating cipher-block chaining)或称为明文密码块链接(Plaintext cipher-block chaining),是一种可以使密文中的微小更改在解密时导致明文大部分错误的模式,并在加密的时候也具有同样的特性。


PCBC主要用于Kerberos v4和WASTE中,而在其它场合的应用较少。对于使用PCBC加密的消息,互换两个邻接的密文块不会对后续块的解密造成影响。正因为这个特性,Kerberos v5没有使用PCBC。
3、密文反馈(CFB)
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:



上述公式是描述的是最简单的CFB,在这种模式下,它的自同步特性仅仅与CBC相同,即若密文的一整块发生错误,CBC和CFB都仍能解密大部分数据,而仅有一位数据错误。若需要在仅有了一位或一字节错误的情况下也让模式具有自同步性,必须每次只加密一位或一字节。可以将移位寄存器作为块密码的输入,以利用CFB的自同步性。
为了利用CFB制作一种自同步的,可以处理任意位情况错误的流密码,需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与明文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位明文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位明文,再将密文的下面x位移入寄存器。
与CBC相似,明文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。在解密时,密文中一位数据的改变仅会影响两个明文块:对应明文块中的一位数据与下一块中全部的数据,而之后的数据将恢复正常。
CFB拥有一些CBC所不具备的特性,这些特性与OFB和CTR的流模式相似:只需要使用块密码进行加密操作,且消息无需进行填充(虽然密文窃取也允许数据不进行填充)。
4、输出反馈(OFB)
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与明文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使明文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算,而在加密后进行校验也可以得出正确结果。



每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
5、计数器模式(CTR)
注意:CTR模式(Counter mode,CM)也被称为ICM模式(Integer Counter Mode,整数计数模式)和SIC模式(Segmented Integer Counter)。
与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。使用简单的、定义好的输入函数是有争议的:批评者认为它“有意的将密码系统暴露在已知的、系统的输入会造成不必要的风险”。目前CTR已经被广泛的使用了,由输入函数造成的问题被认为是使用的块密码的缺陷,而非CTR模式本身的弱点。无论如何,有一些特别的攻击方法,例如基于使用简单计数器作为输入的硬件差错攻击。
CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。
注意:图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。


模式解读之CBC
1)什么是CBC模式
CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。CBC模式加解密过程如下:

我们来比较一下ECB模式与CBC模式的区别

ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。AES-CBC原理:

2)初始化向量
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
3)CBC模式的特点
明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即使明文分组1和明文分组2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
加密过程:在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
解密过程:假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响。见下图:

假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密。见下图:

4)对CBC模式的攻击
假设主动攻击者的目的是通过修改密文来操纵解密后的明文。如果攻击者能够对初始化向量中的任意比特进行反转(将1变成0,将0变成1),则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。见下图。

但是想对密文分组也进行同样的攻击就非常困难了。例如,如果攻击者将密文分组1中的某个比特进行反转,则明文分组2中相应比特也会被反转,然而这一比特的变化却对解密后的明文分组1中的多个比特造成了影响,也就是说,只让明文分1中所期望的特定比特发生变化是很困难的。
5)填充提示攻击
填充提示攻击是一种利用分组密码中填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充数据进行少许改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击并不仅限于CBC模式,而是适用所有需要进行分组填充的模式。
2014年对SSL3.0 造成了重大影响POODLE攻击实际上就是一种填充示攻击。
6)对初始化向量(IV)进行攻击
初始化向量(IV)必须使用不可预测的随机数。然而在SSL/TLS的TLS1.0版本协议中,IV并没有使用不可预测的随机数,而是使用上一次CBC模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TLS1.1以上的版本中改为了必须显示传送IV。
7)CBC模式应用
确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。
参考来源
分组密码
分组密码工作模式
中科学院软件所在分组加密算法差分密码分析方面取得进展
2023年11月中旬消息,中国科学院软件研究所可信智能系统研究团队在分组加密算法的差分密码分析方面取得进展。该工作设计了一个面向分组加密算法的领域编程语言 EasyBC(是工具还是语言还是两者兼有?),在此基础上提出了通用、可扩展的差分密码分析方法,研制了全自动分析工具平台 EasyBC(如下图)。
该研究成果以'EasyBC: A Cryptography-Specific Language for Security Analysis of Block Ciphers against Differential Cryptanalysis'为题被编程语言国际顶级会议 POPL 2024 录用,通讯作者是软件所计算机科学国家重点实验室宋富研究员。

图. EasyBC 平台流程图
分组加密算法(block cipher)是将明文分成多个等长的模块(block),使用对称密钥对每组分别加密或解密,广泛应用于电子邮件加密、银行交易转帐等多个领域。作为极其重要的加密协议组成,主流分组加密算法有中国国家密码管理局颁布的 SM1、SM4 和 SM7,美国政府核定的标准算法 AES 和 3DES。而差分密码分析在评估分组加密算法的安全性方面发挥着核心作用,是分组加密算法标准化不可或缺的安全性分析手段。当前已有的差分密码分析方法在通用性、自动化程度方面存在一定不足,同时建模过程复杂导致用户需要熟悉大量的建模方法及底层分析工具的应用。
为解决上述不足,研究团队设计了一种分组加密算法的密码学专用高级编程语言 EasyBC,提供了完整的语法、类型和语义的形式定义,为分组加密算法安全性自动分析奠定了良好基础;提出了三种不同分析精度和性能的差分密码分析方法,不仅统一和优化了已有的各类加密操作的建模方法,并提出了多种新的建模方法。
研究团队实现了 23 个加密原语,包括美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)认证加密方案的底层置换算法以及多种常用分组加密算法(如图 2);并对其中的分组密码原语进行了安全性分析(如图 3),进而验证了 EasyBC 语言的表达能力以及 EasyBC 工具平台安全性自动分析的有效性。

图.EasyBC 语言实现的 23 个加密原语

图.Word-wise 实现的加密原语差分密码安全性分析结果
该研究对分组加密算法的差分密码分析研究具有重要意义,为后续密码学相关研究者们进行分组加密算法的安全性全自动分析和各类运算操作建模方法性能评估提供了良好的研究基础和平台支撑。
论文信息:
EasyBC: A Cryptography-Specific Language for Security Analysis of Block Ciphers against Differential Cryptanalysis. Pu Sun (ShanghaiTech University), Fu Song* (Institute of Software Chinese Academy of Sciences, and University of Chinese Academy of Sciences), Yuqi Chen (ShanghaiTech University), Taolue Chen (Birkbeck, University of London). Proc. ACM Program. Lang. 8, POPL, Article 29 (January 2024), 33 pages.
全自动分析工具平台-EasyBC
该存储库用于解析分组加密算法的输入 [EasyDC] 程序,然后根据差分密码分析对分组加密算法进行安全分析。它支持以下功能:
EasyBC 的解释器。
基于 SMT 的方法,用于确定各种密码操作的分支数。
S-box 中的差分传播建模。
基于 MaxSMT 的方法,用于确定给定 S-box 的差分分布表 (DDT) 中所有概率的编码。
针对差分密码分析对 EasyBC 中编写的分组加密算法进行安全分析。
现代分组加密创建在迭代的思想上产生密文。其思想由克劳德·香农在他1949年的重要论文《保密系统的通信理论》(Communication Theory of Secrecy Systems)中提出,作为一种通过简单操作如替代和排列等以有效改善保密性的方法。迭代产生的密文在每一轮加密中使用不同的子密钥,而子密钥生成自原始密钥。
DES加密在1977年由前美国国家标准局(今“美国国家标准与技术研究所”)颁布,是现代分组加密设计的基础思想。它同样也影响了密码分析的学术进展。 AES(高级加密标准,Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的 DES,目前已经广为全世界所使用,成为对称密钥算法中最流行的算法之一。
AES加密主要包括两个步骤:密钥扩展和明文加密
密钥扩展:将输入的密钥(16字节、24字节和32字节)进行扩展,根据密钥长度的不同,得到扩展后的密钥进行加密的轮数也不相同。
明文加密:
字节替换:将输入状态的每个字节使用S盒上对应的字节进行替换。
行位移:状态的第一行保持不变。第二行循环左移一个字节,第三行左移两个字节,第四行循环左移三个字节。
列混淆:将每列中的每个字节映射为一个新值,新值由该列中的4个字节通过函数变换得到。
秘钥轮加:将当前分组和扩展密钥的一部分进行按位异或。
分组加密包含两个成对的算法:加密算法E和解密算法D,两者互为反函数。每个算法有两个输入:长度为n位的组,和长度为k位的密钥;两组输入均生成n位输出。将两个算法看作函数,K表示长度为k的密钥(密钥长度),P表示长度为n的分组,P也被表示为明文,C表示密文,则满足条件时成立。
对于任意密钥K,EK(P)是输入的组的一个置换函数,且可逆地落在{0,1}n区间。E的反函数(解密算法)满足条件时成立。
例如,一个分组加密算法使用一段 128 位的分组作为明文,相应输出 128 位的密文;而其转换则受加密算法中第二个输入的控制,也就是密钥k。解密算法类似,使用 128 位的密文和对应的密钥,得到原 128 位的明文。
每一个密钥实际上是选择了n位输入排列的(2^n)!种组合中的一种。大多数的分组密码在在加密算法中会重复使用某一函数进行多轮运算,典型的轮数在4-32次之间,每一轮的函数R使用不同的子密钥Ki,由原密钥生成。
Lucifer一般被认为是第一个现代分组密码,由IBM在1970年代基于霍斯特·费斯妥(Horst Feistel)的工作完成。它的一个修改版本是数据加密标准,被美国政府纳入联邦资料处理标准,并于1976年正式发布,至今仍被广泛应用。
当时设计DES密码的最初目的是为了抵抗某些美国国家安全局(NSA)和IBM知道的密码分析方法,直到1980年代末期,这种被称为差分分析的方法才被毕汉姆(Eli Biham)和萨莫尔(Adi Shamir)独立重新发现。线性分析是另一种方法,NSA在松井充发布这种实验性的密码分析方法之前还并不知道。DES作为早期的分组密码,最早成为密码标准,由于在最初DES并未公布其实现细节,其S盒设计被怀疑包含后门,因此学界对其进行了大量的研究,提高了学界对分组密码的了解,客观上促进了密码学及密码分析的发展,引领了很多密码学和密码分析的研究。另一种分组密码标准高级加密标准(AES)被美国国家标准与技术研究院(NIST)采纳,即将逐渐取代DES目前的位置。
设计安全的分组加密算法,需要考虑对现有密码分析方法的抵抗,如差分分析、线性分析等,还需要考虑密码安全强度的稳定性。此外用软件实现的分组加密要保证每个组的长度适合软件编程(如8、16、32……),尽量避免位置换操作,以及使用加法、乘法、移位等处理器提供的标准指令;从硬件实现的角度,加密和解密要在同一个器件上都可以实现,即加密解密硬件实现的相似性。
在开发中如果有接触到加密,就一定遇到过MD5、DES、Triple DES、AES、RSA等加密方式(这些都叫加密算法),在深入了解加密领域的知识时,除了有加密算法外;还有加密模式(CBC、ECB、CTR、OCF、CFB等),填充模式(NoPadding、PKCS5Padding、PKCS7Padding等)。需要了解一下加密中的加密模式,不同的加密模式对数据加密的安全度不一样。
分组密码有五种工作模式(下文有简述):
1.电码本模式(Electronic Codebook Book,简称ECB):是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。该模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
2.密码分组链接模式(Cipher Block Chaining,简称CBC):是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。该模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
3.计算器模式(Counter,简称CTR):计算器模式不常见,在CTR模式中,有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
4.密码反馈模式(Cipher FeedBack,简称CFB):实际上是一种反馈模式,目的也是增强破解的难度。
5.输出反馈模式(Output FeedBack,简称OFB):实际上是一种反馈模式,目的也是增强破解的难度。
分组密码工作模式
密码学中,分组密码的工作模式(mode of operation)允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到符合密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。
工作模式主要用来进行加密和认证。对加密模式的研究曾经包含数据的完整性保护,即在某些数据被修改后的情况下密码的误差传播特性。后来的研究则将完整性保护作为另一个完全不同的,与加密无关的密码学目标。部分现代的工作模式用有效的方法将加密和认证结合起来,称为认证加密模式。虽然工作模式通常应用于对称加密,它亦可以应用于公钥加密,例如在原理上对RSA进行处理,但在实用中,公钥密码学通常不用于加密较长的信息,而是使用结合对称加密和公钥加密的混合加密方案。
历史和标准化
最早出现的工作模式,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。
初始化向量(IV)
初始化向量(IV,Initialization Vector)是许多任务作模式中用于将加密随机化的一个位块,由此即使同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程。初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。对于CBC和CFB,重用IV会导致泄露明文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。
填充
块密码只能对确定长度的数据块进行处理,而消息的长度通常是可变的。因此部分模式(即ECB和CBC)需要最后一块在加密前进行填充。有数种填充方法,其中最简单的一种是在明文的最后填充空字符以使其长度为块长度的整数倍,但必须保证可以恢复明文的原始长度;例如,若明文是C语言风格的字符串,则只有串尾会有空字符。稍微复杂一点的方法则是原始的DES使用的方法,即在数据后添加一个1位,再添加足够的0位直到满足块长度的要求;若消息长度刚好符合块长度,则添加一个填充块。最复杂的则是针对CBC的方法,例如密文窃取,残块终结等,不会产生额外的密文,但会增加一些复杂度。布鲁斯·施奈尔和尼尔斯·弗格森提出了两种简单的可能性:添加一个值为128的字节(十六进制的80),再以0字节填满最后一个块;或向最后一个块填充n个值均为n的字节。
CFB,OFB和CTR模式不需要对长度不为密码块大小整数倍的消息进行特别的处理。因为这些模式是通过对块密码的输出与明文进行异或工作的。最后一个明文块(可能是不完整的)与密钥流块的前几个字节异或后,产生了与该明文块大小相同的密文块。流密码的这个特性使得它们可以应用在需要密文和明文数据长度严格相等的场合,也可以应用在以流形式传输数据而不便于进行填充的场合。
模式的简介
1、电子密码本(ECB)
最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。


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

原图

使用ECB模式加密

提供了伪随机性的非ECB模式
右图是使用CBC,CTR或任何其它的更安全的模式加密左图可能产生的结果——与随机噪声无异。注意右图看起来的随机性并不能表示图像已经被安全的加密;许多不安全的加密法也可能产生这种“随机的”输出。
ECB模式也会导致使用它的协议不能提供数据完整性保护,易受到重放攻击的影响,因为每个块是以完全相同的方式解密的。例如,“梦幻之星在线:蓝色脉冲”在线电子游戏使用ECB模式的Blowfish密码。在密钥交换系统被破解而产生更简单的破解方式前,作弊者重复通过发送加密的“杀死怪物”消息包以非法的快速增加经验值。
2、密码块链接(CBC)
1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。



CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。解决后一个问题的一种方法是利用密文窃取。
注意在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
填充密码块链接(PCBC)
填充密码块链接(PCBC,Propagating cipher-block chaining)或称为明文密码块链接(Plaintext cipher-block chaining),是一种可以使密文中的微小更改在解密时导致明文大部分错误的模式,并在加密的时候也具有同样的特性。


PCBC主要用于Kerberos v4和WASTE中,而在其它场合的应用较少。对于使用PCBC加密的消息,互换两个邻接的密文块不会对后续块的解密造成影响。正因为这个特性,Kerberos v5没有使用PCBC。
3、密文反馈(CFB)
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:



上述公式是描述的是最简单的CFB,在这种模式下,它的自同步特性仅仅与CBC相同,即若密文的一整块发生错误,CBC和CFB都仍能解密大部分数据,而仅有一位数据错误。若需要在仅有了一位或一字节错误的情况下也让模式具有自同步性,必须每次只加密一位或一字节。可以将移位寄存器作为块密码的输入,以利用CFB的自同步性。
为了利用CFB制作一种自同步的,可以处理任意位情况错误的流密码,需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与明文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位明文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位明文,再将密文的下面x位移入寄存器。
与CBC相似,明文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。在解密时,密文中一位数据的改变仅会影响两个明文块:对应明文块中的一位数据与下一块中全部的数据,而之后的数据将恢复正常。
CFB拥有一些CBC所不具备的特性,这些特性与OFB和CTR的流模式相似:只需要使用块密码进行加密操作,且消息无需进行填充(虽然密文窃取也允许数据不进行填充)。
4、输出反馈(OFB)
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与明文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使明文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算,而在加密后进行校验也可以得出正确结果。



每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
5、计数器模式(CTR)
注意:CTR模式(Counter mode,CM)也被称为ICM模式(Integer Counter Mode,整数计数模式)和SIC模式(Segmented Integer Counter)。
与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。使用简单的、定义好的输入函数是有争议的:批评者认为它“有意的将密码系统暴露在已知的、系统的输入会造成不必要的风险”。目前CTR已经被广泛的使用了,由输入函数造成的问题被认为是使用的块密码的缺陷,而非CTR模式本身的弱点。无论如何,有一些特别的攻击方法,例如基于使用简单计数器作为输入的硬件差错攻击。
CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。
注意:图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。


模式解读之CBC
1)什么是CBC模式
CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。CBC模式加解密过程如下:

我们来比较一下ECB模式与CBC模式的区别

ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。AES-CBC原理:

2)初始化向量
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
3)CBC模式的特点
明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即使明文分组1和明文分组2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
加密过程:在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
解密过程:假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响。见下图:

假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密。见下图:

4)对CBC模式的攻击
假设主动攻击者的目的是通过修改密文来操纵解密后的明文。如果攻击者能够对初始化向量中的任意比特进行反转(将1变成0,将0变成1),则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。见下图。

但是想对密文分组也进行同样的攻击就非常困难了。例如,如果攻击者将密文分组1中的某个比特进行反转,则明文分组2中相应比特也会被反转,然而这一比特的变化却对解密后的明文分组1中的多个比特造成了影响,也就是说,只让明文分1中所期望的特定比特发生变化是很困难的。
5)填充提示攻击
填充提示攻击是一种利用分组密码中填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充数据进行少许改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击并不仅限于CBC模式,而是适用所有需要进行分组填充的模式。
2014年对SSL3.0 造成了重大影响POODLE攻击实际上就是一种填充示攻击。
6)对初始化向量(IV)进行攻击
初始化向量(IV)必须使用不可预测的随机数。然而在SSL/TLS的TLS1.0版本协议中,IV并没有使用不可预测的随机数,而是使用上一次CBC模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TLS1.1以上的版本中改为了必须显示传送IV。
7)CBC模式应用
确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。
参考来源
分组密码
分组密码工作模式
中科学院软件所在分组加密算法差分密码分析方面取得进展
2023年11月中旬消息,中国科学院软件研究所可信智能系统研究团队在分组加密算法的差分密码分析方面取得进展。该工作设计了一个面向分组加密算法的领域编程语言 EasyBC(是工具还是语言还是两者兼有?),在此基础上提出了通用、可扩展的差分密码分析方法,研制了全自动分析工具平台 EasyBC(如下图)。
该研究成果以'EasyBC: A Cryptography-Specific Language for Security Analysis of Block Ciphers against Differential Cryptanalysis'为题被编程语言国际顶级会议 POPL 2024 录用,通讯作者是软件所计算机科学国家重点实验室宋富研究员。

图. EasyBC 平台流程图
分组加密算法(block cipher)是将明文分成多个等长的模块(block),使用对称密钥对每组分别加密或解密,广泛应用于电子邮件加密、银行交易转帐等多个领域。作为极其重要的加密协议组成,主流分组加密算法有中国国家密码管理局颁布的 SM1、SM4 和 SM7,美国政府核定的标准算法 AES 和 3DES。而差分密码分析在评估分组加密算法的安全性方面发挥着核心作用,是分组加密算法标准化不可或缺的安全性分析手段。当前已有的差分密码分析方法在通用性、自动化程度方面存在一定不足,同时建模过程复杂导致用户需要熟悉大量的建模方法及底层分析工具的应用。
为解决上述不足,研究团队设计了一种分组加密算法的密码学专用高级编程语言 EasyBC,提供了完整的语法、类型和语义的形式定义,为分组加密算法安全性自动分析奠定了良好基础;提出了三种不同分析精度和性能的差分密码分析方法,不仅统一和优化了已有的各类加密操作的建模方法,并提出了多种新的建模方法。
研究团队实现了 23 个加密原语,包括美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)认证加密方案的底层置换算法以及多种常用分组加密算法(如图 2);并对其中的分组密码原语进行了安全性分析(如图 3),进而验证了 EasyBC 语言的表达能力以及 EasyBC 工具平台安全性自动分析的有效性。

图.EasyBC 语言实现的 23 个加密原语

图.Word-wise 实现的加密原语差分密码安全性分析结果
该研究对分组加密算法的差分密码分析研究具有重要意义,为后续密码学相关研究者们进行分组加密算法的安全性全自动分析和各类运算操作建模方法性能评估提供了良好的研究基础和平台支撑。
论文信息:
EasyBC: A Cryptography-Specific Language for Security Analysis of Block Ciphers against Differential Cryptanalysis. Pu Sun (ShanghaiTech University), Fu Song* (Institute of Software Chinese Academy of Sciences, and University of Chinese Academy of Sciences), Yuqi Chen (ShanghaiTech University), Taolue Chen (Birkbeck, University of London). Proc. ACM Program. Lang. 8, POPL, Article 29 (January 2024), 33 pages.
全自动分析工具平台-EasyBC
该存储库用于解析分组加密算法的输入 [EasyDC] 程序,然后根据差分密码分析对分组加密算法进行安全分析。它支持以下功能:
EasyBC 的解释器。
基于 SMT 的方法,用于确定各种密码操作的分支数。
S-box 中的差分传播建模。
基于 MaxSMT 的方法,用于确定给定 S-box 的差分分布表 (DDT) 中所有概率的编码。
针对差分密码分析对 EasyBC 中编写的分组加密算法进行安全分析。