DES加密算法
DES简介
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的基本上是同一个算法。其密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。
算法大致流程
大概流程如下
具体一些的如下
原理和实现
由第二节的流程图,我们大概知道了,DES加密算法大概流程为
IP置换 => 16轮迭代 =>IP逆置换 三个步骤
其中涉及到F轮函数的设计以及密钥生成方法,下面将分别介绍。
IP置换
将64位二进制明文按照下表进行置换,经过置换后,明文的第i
位变成了原来的IP_1[i]
位。
置换之后再把64位明文分为L0和R0两部分,各32位。
代码实现:
1 | bool data[65],L_0[65],R_0[65]; // 明文以及打乱之后分开的L0和R0 |
轮函数
轮函数分为四步:
E扩展
扩展置置换目标是IP置换后获得的右半部分R_0,将32位输入扩展为48位(分为4位×8组)输出。
由流程图可知这个函数只对R_0用
,而L_0是直接赋值的。
E扩展置换表为
可以发现,这个置换表的原理就是,把32bit数据分成8组,每组4bit,把每个4bit数据最左边添加上其上一组4bit数据的第四位,每个4bit数据最右边添加上其下一组数据的第一位,其中第一组和最后一组是相邻的。这样就把8 * 4bit = 32bit
数据转变成了8 * 6bit = 48bit
数据。
轮密钥异或
扩展置换之后,右半部分数据R_0变为48位,与轮密钥进行异或,这里只需要知道轮密钥是由密钥生成函数产生的,其长度也为48bit,密钥生成函数后面会提到。
S盒压缩
将异或之后的48位R_0分成8组,每组长度为6bit,将它们分别输入到S_1到S_8这8个盒中,每个盒产生4位输出,最后将输出拼接成4 * 8 = 32bit
数据。
具体方法为:
把6bit数据首尾2位拿出来,中间4位拿出来,拼接转化成10进制数,假设分别为a,b,输出就是第S_i盒的第a行第b列。再把这个十进制数转化为4位2进制数,就实现了S盒的压缩功能。
P置换
最后再进行一次P盒置换
代码实现:
1 | int E[33] = |
IP逆置换
16轮迭代后将L16与R16合并,形成64位二进制,然后按照下表进行逆初始置换,得到最终的64位密文。
代码实现:
1 | int IP2[65] = |
密钥生成
之前只介绍了关于密钥的使用,但是第k轮的密钥是如何获得的并没有说明。
密钥生成流程如下
将初始的64位密钥按顺序编号,然后填充为8*8矩阵,最后一列作为奇偶校验位(也就是8,16,24,32,40,48,56和64这8位),其他的56位组成初始56位密钥。
随后将初始56位密钥按下图的置换表进行置换,打乱密钥顺序
发现从64位变成了56位,我们把这56位分成两份Ci和Di,每份28位,按下方的移位次数表进行移位
每一轮移位以后我们都可以将C和D拼起来获得一个56位密钥Ki,再按照下表对密钥进行压缩,从56位变成48位,就可以用到轮函数的计算中了。
代码实现:
1 | int Key[65], Key_Trans[65], C[65], D[65]; |
解密过程
DES算法的解密和加密是一个原理,算法也基本类似,只有少数地方不同
若加密时子密钥的使用顺序是K1, K2…K16,那么解密时顺序就是K16, K15…K1
加密生成密钥时是循环左移,解密生成密钥时是循环右移
完整的轮子(网上嫖的)
1 | //经过上述对DES算法每一步的深入研究分析,在理论上对DES算法的实现有了较为清晰的思路,笔者将依据上述理论分析,在Windows10操作系统下,利用Codeblocks开发环境,采用C++11标准对DES算法进行代码实现。 |