密码学 实现64bit DES C语言

算法描述:

1.Feistel网络结构

密码学 实现64bit DES C语言_第1张图片

  1. 其特性参数:

①明文(输入)块大小(Block Size):64bit~128bit,且是2的倍数;

②密钥长度/大小(Key Size):56~256

③Number of Rounds:循环次数

④Round Function:轮函数,一定是非线性的,不要求可逆

  1. 加解密过程

明文(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的明文进行相同步骤的加密操作,循环操作。

注意:最后一轮的结果在基本流程上要再交换左右两部分以保证加密与解密的结构相同。

密码学 实现64bit DES C语言_第2张图片

Feistel网络结构有一个特点,就是加密与解密流程是完全相同的。也就是加密解密算法相同,不同的只是初始输入值与子密钥的使用顺序(即所谓加密解密对称性)。

密码学 实现64bit DES C语言_第3张图片

2.DES算法

密码学 实现64bit DES C语言_第4张图片

  1. IP置换

   IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:

密码学 实现64bit DES C语言_第5张图片

    表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。

要注意一点,位数是从左边开始数的,即最0x0000 0080 0000 0002最左边的位为1,最右边的位为64。

  1. 子密钥的生成(密钥置换)

不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表置换生成(注意表中没有8,16,24,32,40,48,56和64这8位):

密码学 实现64bit DES C语言_第6张图片

   在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如    

   1).将56位的密钥分成两部分,每部分28位。

   2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:

移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。压缩置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):

密码学 实现64bit DES C语言_第7张图片

  1. DES的F函数

密码学 实现64bit DES C语言_第8张图片

(1)将64bit的明文右半部分即32bit扩展为48bit:

 

 采用的是4个bit一组,分为8组,每一组前后各加1bit(增加的bit数=2*1*8=16bit)。其增加按照下表进行(虚线以外的为增加的bit所在位置,如:第一组前是32,即在第一组前加一个bit为整个右半部分的32bit的第32位的bit值{0,1}):

密码学 实现64bit DES C语言_第9张图片

(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;

(3)将扩充信息和子密钥异或后的结果进行压缩(48bit压缩到32bit),压缩的方式是经过S盒(4*16的矩阵)进行替换,S盒函数是经过严格计算获得的,其S1盒的替换表与流程如下所示:

密码学 实现64bit DES C语言_第10张图片

    一个组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。

密码学 实现64bit DES C语言_第11张图片

 

密码学 实现64bit DES C语言_第12张图片

密码学 实现64bit DES C语言_第13张图片

密码学 实现64bit DES C语言_第14张图片密码学 实现64bit DES C语言_第15张图片

 

(4)置换运算P(经过一个P盒进行置换):

   指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。

密码学 实现64bit DES C语言_第16张图片

表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第16位放到新数据的第1位,第7位放到第2位,……依此类推,第25位放到第32位。

例如0x10A1 0001进行P盒置换后变为0x8000 0886。

  1. IP-1末置换

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:

密码学 实现64bit DES C语言_第17张图片

实验内容:

  1.  IP置换

   IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。置换规则如下:

密码学 实现64bit DES C语言_第18张图片

密码学 实现64bit DES C语言_第19张图片

密码学 实现64bit DES C语言_第20张图片

  1. 子密钥的生成(密钥置换)

(1)56位密钥置换生成:

密码学 实现64bit DES C语言_第21张图片

密码学 实现64bit DES C语言_第22张图片密码学 实现64bit DES C语言_第23张图片

(2)在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式

    1).将56位的密钥分成两部分,每部分28位。

   2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:

密码学 实现64bit DES C语言_第24张图片

密码学 实现64bit DES C语言_第25张图片

(3)移动后,从56位中选出48位。压缩置换。压缩置换规则如下表

密码学 实现64bit DES C语言_第26张图片

密码学 实现64bit DES C语言_第27张图片

密码学 实现64bit DES C语言_第28张图片

完整代码:

密码学 实现64bit DES C语言_第29张图片

密码学 实现64bit DES C语言_第30张图片

  1. DES的F函数

(1)将64bit的明文右半部分即32bit扩展为48bit:

密码学 实现64bit DES C语言_第31张图片

密码学 实现64bit DES C语言_第32张图片

密码学 实现64bit DES C语言_第33张图片

(2)得到的48bit扩充信息,和子密钥Ki进行异或操作,得到48bit的结果;

密码学 实现64bit DES C语言_第34张图片

(3)压缩(48bit->32bit): S盒(4*16的矩阵)进行替换

密码学 实现64bit DES C语言_第35张图片

 一个组6bit,共8组(6bit*8=48bit),即有8个S盒,每个S盒是固定的但是都是不相同的。拿S1盒来说:B1B2B3B4B5B6,第一个比特和最后一个比特,即B1B6确定表中的行数;每一组的中间四个比特确定列数。

密码学 实现64bit DES C语言_第36张图片

(4)置换运算P(经过一个P盒进行置换):

   指的是将32bit压缩后的信息进行bit置换操作,改换位操作目的是打乱其原有排序规律(F函数的混乱性原则)。

密码学 实现64bit DES C语言_第37张图片

密码学 实现64bit DES C语言_第38张图片

(5)L0与经过F变换的R0异或,放到R1位置,L0位置放R0

密码学 实现64bit DES C语言_第39张图片

完整代码:

密码学 实现64bit DES C语言_第40张图片

密码学 实现64bit DES C语言_第41张图片

  1. IP-1末置换

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:

密码学 实现64bit DES C语言_第42张图片

密码学 实现64bit DES C语言_第43张图片

密码学 实现64bit DES C语言_第44张图片

【DES加解密】:

加密:mingwen.txt

密码学 实现64bit DES C语言_第45张图片

密码学 实现64bit DES C语言_第46张图片

解密:miwen.txt

密码学 实现64bit DES C语言_第47张图片

 密码学 实现64bit DES C语言_第48张图片

 

区别在于:输入的子密钥SK顺序不同,一个是正序,一个是逆序。

【DES输出密文变化bit数】:

(1)随机生成明文和密钥,组成明文密钥对。(因为每组明文密钥对只能输出64条结果,所以需要生成多组明文密钥对)

(2)生成每组明文密钥对所对应的初始密文

(3)循环64次,按位更改明文,每次更改第J位的明文(M[j])使它取反,生成密文,比较完两个密文后复位M[j]

(4)比较密文与更改明文后得到密文,得到变化bit数并输出

密码学 实现64bit DES C语言_第49张图片

密码学 实现64bit DES C语言_第50张图片

你可能感兴趣的:(岛爷札记,学习)