DES算法

一、DES算法原理概述

DES算法是这样的一个算法:它使用密钥和明文作为参数,经过一系列复杂的运算过程,输出明文对应的密文。首先要指出的是,明文是按照每64位一个分组来进行输入的。输出的对应密文也是64位。而密钥虽说也是64位,但是其中8位用来做奇偶校验位,故真正有用的只有56位。DES通过其巧妙的设计,使得加密和解密可以使用同一套密钥和同一个算法。
DES算法具体实现过程如下:
1、首先将输入的64位明文进行一个初始的IP置换。所谓的置换就是根据已经规定好的顺序将所有位数重新排序。如下图所示,“58”出现在第一位,说明第一位将在新64位数的第58位,以此类推。
这里写图片描述
本算法中将多次用到“置换”这种方法,其意思都是一样的,区别的是每次这个所谓的“规定好的顺序”不同而已。置换之后得到的64位数,我们将它叫做afterFirstIPChange,将这个afterFirstIPChange的64位从中间分成两半,分别叫做L0、R0,顾名思义。这个L0、R0将和密钥K作为算法下一个模块的初始化数据 (如果将算法的下一个模块实现成一个独立的函数的话,那么L0、R0和K就是这个独立函数的输入参数)。

2、在这一步,我们将做一个16次的循环 (分别称为循环1、循环2……循环16)。
每次循环操作都需要用到密钥K的一个子密钥Ki。所以我们先说清楚Ki是怎么来的:前面说过,K虽然有64位,但是其中只有56位会被我们利用(被排除的位数分别是:第8、16、24、32、40、48、56、64位)。之后,我们对K的剩下的位数进行PC-1置换,置换表如下:
这里写图片描述

之后我们将得到一个数:afterPC1,我们也将它从中间分成两半,分别叫做C0、D0。然后,根据C0、D0,我们做16个循环,循环i生成Ki。每次循环执行以下步骤:计算 Ci = LSi(Ci-1) 和 Di = LSi(Di-1)。其中,LSi函数表示左移函数:当 i =1, 2, 9, 16 时,LSi (string) 表示将二进制串 string 循环左移一个位置; 否则循环左移两个位置。这样子得到 Ci和Di之后将它们合并成CiDi (56位),将这个56位的CiDi执行PC-2压缩置换,得到的就是48位的Ki。16次循环后得到一个序列:K1,…, K16 。
所谓的压缩置换,就是从56位的CiDi中去掉第9,18,22,25,35,38,43, 54位,将剩下的48位按照 PC-2置换表作置换:
这里写图片描述
说完Ki是怎么来的之后,我们说回原来的循环,每次循环的参数都有:Li-1、Ri-1和Ki。每次循环的具体内容为:先将32位的Ri-1进行E扩展得到48位的结果,我们可以称它为afterEChangei。
这里先说一下什么是E扩展。其实跟置换表的原理是一样的。见:
这里写图片描述

然后将afterEChangei和对应的子密钥Ki进行异或运算得到一个数afterXORi(48位)。将这个afterXORi从左到右分成8组,每组6位,分别通过8个S盒S1、S2、S3、S4、S5、S6、S7、S8。
这里也先介绍一下S盒:S盒是这样一个函数:输入6个位,通过这8个位的值来决定其输出,输出4个位。其决定规则是这样的:将6位中的首位和尾位取出来组成一个新的数,该数对应的10进制数作为行号,中间4个位对应的十进制数作为列号,在S盒对应的表中查找对应行列的数,这个数的二进制数就是我们要的结果。如下图S1盒,举个例子,若输入是000100,则行数是(00)10 = 0,列数是(0010)10=2,对应的数是13,其二进制数是11012。就是我们所要的第一组的输出。
这里写图片描述
这里写图片描述

所有S盒如下所示:
这样所有位通过之后再将结果整合起来就是32位。然后再将这个32位数做一个P盒置换,得到afterPBoxChangei 。
这里写图片描述
最后将这个afterPBoxChangei同Li-1进行异或运算得到的结果就是Ri。而Li的值就是Ri-1。
就这样,循环16次之后得到了L16、R16。将它们交换之后组合成R16L16 (64位)这个数,便是下一阶段需要操作的数。
3、这一步将第二步得到的R16L16作为输入,进行一个“逆置换IP-1”。得到的结果就是我们想要的结果,即“密文”。
这里写图片描述
4、解密过程。因为DES置换表的巧妙设计,使得DES 的加密和解密过程可以使用同一套密钥和同一个算法。区别只是中间子密钥的使用顺序:加密过程是K1-K16的顺序使用,解密过程使用的顺序相反,从K16到K1。其余过程一样,故不赘述。

二、总体结构

这里写图片描述

三、模块分解

根据第一部分的描述可以将该算法分成4个模块。
第一个模块是64位明文输入后的IP置换,这个模块的输入是64位明文,输出置换运算后的64位数的左半部分和右半部分。
第二个模块是子密钥的产生。这个模块的输入是64位的密钥,这个模块将进行16次迭代循环,每一次循环后输出一个数,这个数便是这一轮循环产生的子密钥。16次循环之后产生一个子密钥序列K1,…, K16 ,这个子密钥序列将参与另一个模块的运算。
第三个模块是16次复杂的迭代循环运算,第i次迭代使用的参数是Li-1、Ri-1和Ki。Ki是第二个模块的第i次迭代循环产生的子密钥。该模块第i次迭代生成Li和Ri。 第16次迭代循环之后生成L16和R16是这个模块的输出。
最后一个模块是IP逆置换模块。它的输入是前一个模块产生的R16和L16合并成的64位数R16L16;输出是密文,也就是整个算法的最终结果。
由于加密和解密使用的是同一套密钥和算法,只是中间有一点细微的不同,故解谜过程不单独设置一个模块,只需要直接使用上面所说的模块即可。

四、数据结构

第一个模块可使用的数据结构是数组和矩阵。需要使用两个64位的布尔数组和一个8X8的整型矩阵。
第二个模块也是可以直接使用数组和矩阵。需要用到的是两个28位的数组、一个56位的数组、一个48位的数组、一个7X8整型矩阵和一个6X8整型矩阵。
第三个模块需要使用数组、整型矩阵以及struct结构体。需要用到多个32位、多个48位的布尔数组和两个struct结构体,其中一个包含8个6位大小的布尔数组,另一个包含8个4位大小的布尔数组。此外,还需要一个6x8的整型矩阵和8个16x4的整型矩阵。
第四个模块需要使用的是数组和整型矩阵。需要两个64位的布尔数组和一个8x8的整型矩阵。

五、类-C语言算法过程

以下是使用C++语言 + 一些伪代码实现的DES算法。其中,因为S1盒到S8盒的算法基本完全一致,故只写出了S1盒作为代表。其他的一些教繁琐的运算直接使用了伪代码来说明。如异或运算:afterEChange XOR subKey[i],以及二进制和十进制的互相转换。

bool* IPChange(bool inputText[]) {
  bool result[64];
  int IPBox[64] = {
  58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28,
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值