分组密码总结
作者:互联网
分组密码
分组密码就是将明文消息序列划分成长为n的组,各组分别在密钥k控制下,变成等长的输出序列。
- 代换: 明文分组到密文分组的可逆变换为代换。
- 扩散和混淆: 扩散和混淆是
Shannonon
提出的设计密码系统的两个基本方法,目的是抗击敌手对密码系统的统计分析。扩散是将明文的统计特性散布到密文中,使密文中的每一位由明文中多位产生。混淆是使密文和密钥之间的统计关系变得尽可能的复杂,使敌手无法获得密钥。
Feistel
密码结构
很多分组密码的本质是Feistel
结构。是一种代换-置换网络。其结构如下
如图,加密算法输入是分组长为2w
的明文和一个密钥K。将每组明文分为左右两半L0和R0,在进行为n轮迭代后,左右两半合在一起产生密文分组。其第i轮迭代为:
L
i
=
R
i
−
1
L_i = R_{i-1}
Li=Ri−1
R i = L i − 1 ⨁ F ( R i − 1 , K i ) R_i = L_{i-1}\bigoplus F(R_{i-1},Ki) Ri=Li−1⨁F(Ri−1,Ki)
Feistel
网络的安全性与以下参数有关:
- 分组大小
- 密钥大小
- 轮数
- 子密钥产生算法
- 轮函数
Feistel
解密结构
Feistel
解密结构和加密本质一样,算法使用密文作为输入,但使用密钥Ki的次序与加密的过程相反。如上图右边。
数据加密标准DES
如上图是DES的算法框图,其中明文分组长为64比特,密钥长为56比特。左边是明文处理过程,分为3个阶段。
- 初始置换
IP
用于重排64比特明文数据,规则如下表:
如:第1位用第58位替换
- 轮变换
进行具有相同功能的16轮变换,每轮都有置换和代换运算。具体结构如下:
(其中右边为密钥的生成)
将64比特分组的明文分为左右两部分,记为L,R和Feistel
网络结构一样。右半部分R为32比特,首先经过选择扩展运算E,扩展为48比特。选择扩展运算E规则如下表:
扩展后的48比特在于子密钥Ki异或,然后在经过S盒,由48比特变为32比特的输出。S盒运算如下:
将48比特的数据分为8个6比特的分组分别通过s1,s2,...,s8
的转换。
将通过S盒运算产生的32比特数据再经过置换运算P输出32比特,置换运算P规则如下:
接下来就按照上面图示进行。
- 密钥的产生
接下来讲解图中右边的密钥产生算法。输入算法的56比特首先经过一个置换运算PC-1,产生56比特输出,规则如下:
然后将置换后的56比特分为各为28比特的左右两部分,记为C,D,在第i轮分别对Ci-1和Di-1进行循环左移,移位数由上表所示。移位的结果作为下一轮的子密钥的输入,同时也作置换选择2的输入。通过置换选择2产生48比特的Ki,作为本轮的子密钥参与加密的轮变换。置换选择2由上图所示。
解密
和Feistel
结构一样,DES加密和解密使用同一算法,而子密钥使用顺序相反。
二重DES
为了提高DES的安全性,可使用二重DES,其中P为明文,K1
和K2
为两个加密密钥。密文为
C
=
E
K
2
[
E
K
1
[
P
]
]
C=E_{K_2}[E_{K_1}[P]]
C=EK2[EK1[P]]
解密
P
=
D
K
1
[
D
K
2
[
C
]
]
P = D_{K_1}[D_{K_2}[C]]
P=DK1[DK2[C]]
对二重DES可以采用中途相遇攻击:
如果已知一个明文密文对,首先用所有的256个可能的`K1`对明文加密,将加密结果存入一个表,然后用256个所有可能的K2
对密文解密,在上述的表中找到与解密结果相匹配的项,找到就可以确定K1
和K2
是所要找的密钥。
三重DES
为了抵抗中途相遇攻击,可以使用三重DES,使用两个密钥作三次加密
C
=
E
K
1
[
D
K
2
[
E
K
1
[
P
]
]
]
C=E_{K_1}[D_{K_2}[E_{K_1}[P]]]
C=EK1[DK2[EK1[P]]]
差分密码分析和线性密码分析
差分密码分析是迄今已知攻击迭代密码最有效的方法之一,其基本思想是:通过分析明文对的差值对密文对的差值的影响来恢复某些密钥比特。
线性密码分析是对迭代密码的一种已知明文攻击,它利用的是密码算法中的“不平衡的线性逼近”。
分组密码的运行模式
分组密码在加密时明文分组的长度是固定,而实用中待加密消息的数据量是不定的,数据格式可能多种多样,所以产生了4中分组密码的运行模式。
- 电码本模式
ECB
每个分组独立的以同一密钥加密。用于传送短数据。
长度不够需要进行填充,可以用于传递DES密钥。但如果明文分组在消息中重复出现的话,密文分组也一样,这会给攻击者带来方便。
- 密码分组链接模式CBC
为了解决ECB
的安全缺陷,CBC可以让重复的明文分组产生不同的密文分组。适用于数据分组和认证。
一次对一个明文分组加密,每次加密使用同一密钥,加密算法的输入当前明文分组和前一次密文分组的异或。
IV应该被保密发送给对方。
- 密码反馈模式
CFB
利用CFB
可以将分组密码转换为流密码,加密时,加密算法的输入是64比特的移位寄存器,其初始值是某个初始向量IV。加密算法输出的最左j比特于明文的第一个单元P1
异或,产生的密文的第一个单元C1
,并传送该单元。然后将移位寄存器的内容左移j位,并将C1
送入移位寄存器的最右j位。
- 输出反馈模式
OFB
OFB
类似于CFB
不同之处在于OFB
模式是将加密算法的输出反馈到移位寄存器,而CFB
是将密文单元反馈到移位寄存器。
优点:
不需要填充
错误不传播
抗消息流篡改攻击的能力不如CFB
AES
算法
在AES
标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:
AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示:
类似地,128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加(下面介绍);后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示:
AES的整体结构如下图所示,其中的W[0,3]是指W[0]、W[1]、W[2]和W[3]串联组成的128位密钥。加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。
上图也展示了AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。
一、字节代换
字节代换是非线性变换,独立的对每个字节进行,代换表(S盒)是可逆的,由如下两个步骤实现:
(1)首先,将字节看作GF(2^8)上的元素,映射到自己的乘法逆元。
(2)对每个字节作以下变换
其实可以不用进行计算,S盒是一个固定的表,可以查表得到字节代换结果。
逆字节代换通过以上的逆运算得到,也可以查逆S盒。
二、行移位
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:
行移位的逆变换是将状态矩阵中的每一行执行相反的移位操作,例如AES-128中,状态矩阵的第0行右移0字节,第1行右移1字节,第2行右移2字节,第3行右移3字节。
三、列混合
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:
其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这里涉及到一些信息安全上的数学知识,不过不懂这些知识也行。其实这种二元运算的加法等价于两个字节的异或,乘法则复杂一点。对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算,设S1 = (a7 a6 a5 a4 a3 a2 a1 a0),刚0x02 * S1如下图所示:
也就是说,如果a7为1,则进行异或运算,否则不进行。
类似地,乘以(00000100)可以拆分成两次乘以(00000010)的运算:
乘以(0000 0011)可以拆分成先分别乘以(0000 0001)和(0000 0010),再将两个乘积异或:
列混合逆运算
四、轮密钥加
轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,他们的生成算法下面在下面介绍。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
密钥扩展
AES首先将初始密钥输入到一个4*4的状态矩阵中,如下图所示。
这个44矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为"abcdefghijklmnop",则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。
接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字,其值见下表。
列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字,其值见下表。
AES的讲解参考了https://blog.csdn.net/qq_28205153/article/details/55798628
标签:总结,加密,字节,比特,明文,密码,分组,密钥 来源: https://blog.csdn.net/weixin_44109140/article/details/121957760