1.Feistel网络结构
①明文(输入)块大小(Block Size):64bit~128bit,且是2的倍数;
②密钥长度/大小(Key Size):56~256
③Number of Rounds:循环次数
④Round Function:轮函数,一定是非线性的,不要求可逆
明文(Plaintext)长度为2W位(该结构加密的名文bit数长度必须为偶数,比如DES的明文长度为64bit)。
①先将2w位的明文分为左半部分(前w位L0)和右半部分(后w位R0)。
②将输入的右侧R0,直接输出到输出的左侧为密文的左半部分L1。
③将输入的右侧R0与子密钥K1进行F函数操作(K1和R0作为自变量)得到运算结果,即Output_1 = F(K1,R0)。
④将经过F函数运算的结果Output_1与L0进行异或操作,得到结果作为密文的右半部分R1。
⑤第一轮Round1的密文作为第二轮Round2的明文进行相同步骤的加密操作,循环操作。
注意:最后一轮的结果在基本流程上要再交换左右两部分以保证加密与解密的结构相同。
Feistel网络结构有一个特点,就是加密与解密流程是完全相同的。也就是加密解密算法相同,不同的只是初始输入值与子密钥的使用顺序(即所谓加密解密对称性)。
2.DES算法
IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:
表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。
要注意一点,位数是从左边开始数的,即最0x0000 0080 0000 0002最左边的位为1,最右边的位为64。
不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表置换生成(注意表中没有8,16,24,32,40,48,56和64这8位):
在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如
1).将56位的密钥分成两部分,每部分28位。
2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。压缩置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):
(1)将64bit的明文右半部分即32bit扩展为48bit:
采用的是4个bit一组,分为8组,每一组前后各加1bit(增加的bit数=2*1*8=16bit)。其增加按照下表进行(虚线以外的为增加的bit所在位置,如:第一组前是32,即在第一组前加一个bit为整个右半部分的32bit的第32位的bit值{0,1}):
(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;
(3)将扩充信息和子密钥异或后的结果进行压缩(48bit压缩到32bit),压缩的方式是经过S盒(4*16的矩阵)进行替换,S盒函数是经过严格计算获得的,其S1盒的替换表与流程如下所示:
一个组6bit,共8组(6bit*8=48bit),即有8个S盒,每个S盒是固定的但是都是不相同的。拿S1盒来说:B1B2B3B4B5B6,第一个比特和最后一个比特,即B1B6确定表中的行数;每一组的中间四个比特确定列数。
eg:B1B2B3B4B5B6=101011。则B1B6=11(3)确定最后一行,B2B3B4B5=0101(5)确定第5列。3行5列即值为9(1001),所以101011的6bit经过压缩后的4bit为1001。
(4)置换运算P(经过一个P盒进行置换):
指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。
表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第16位放到新数据的第1位,第7位放到第2位,……依此类推,第25位放到第32位。
例如0x10A1 0001进行P盒置换后变为0x8000 0886。
末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:
IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:
(1)56位密钥置换生成:
(2)在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式
1).将56位的密钥分成两部分,每部分28位。
2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
(3)移动后,从56位中选出48位。压缩置换。压缩置换规则如下表
完整代码:
(1)将64bit的明文右半部分即32bit扩展为48bit:
(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;
(3)压缩(48bit->32bit): S盒(4*16的矩阵)进行替换
一个组6bit,共8组(6bit*8=48bit),即有8个S盒,每个S盒是固定的但是都是不相同的。拿S1盒来说:B1B2B3B4B5B6,第一个比特和最后一个比特,即B1B6确定表中的行数;每一组的中间四个比特确定列数。
(4)置换运算P(经过一个P盒进行置换):
指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。
(5)L0与经过F变换的R0异或,放到R1位置,L0位置放R0
完整代码:
末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:
【DES加解密】:
加密:mingwen.txt
解密:miwen.txt
区别在于:输入的子密钥SK顺序不同,一个是正序,一个是逆序。
【DES输出密文变化bit数】:
(1)随机生成明文和密钥,组成明文密钥对。(因为每组明文密钥对只能输出64条结果,所以需要生成多组明文密钥对)
(2)生成每组明文密钥对所对应的初始密文
(3)循环64次,按位更改明文,每次更改第J位的明文(M[j])使它取反,生成密文,比较完两个密文后复位M[j]
(4)比较密文与更改明文后得到密文,得到变化bit数并输出