DES加解密算法的实现

一、实验目的及任务:

实现DES加解密算法。需要自行实现加解密算法的处理细节,不可直接使用已有的函数接口。并验证以下事实:

  1. 加解密算法的正确性(即加密一个明文,能够得到一个正确的密文;解密一个密文,能得到正确的明文);
  2. 雪崩效应(包括明文和密钥的雪崩效应,即在密钥相同的情况下,1比特的明文差异能够产生多少比特的密文差异,和在明文相同的情况下,1比特的密钥差异能够产生多少比特的密文差异);
  3. 比较加解密算法的运行效率(采用多次运行求平均的方法);

二、实验环境

IDE:VS2015

OS:Windows10

语言:C语言

三、 实验原理

要深入理解对称加密算法,掌握DES加密过程。具备一定的C语言编程技

能。

DES( Data DES( Data Encryption Standard)算法,于1977年得到美国政

府的正式许可,是一种用56位密钥来加密64位数据的方法。DES算法以被应用于许多需要安全加密的场合。

()、密钥生成

1、变换密钥

取得64位的密钥,每个第8位作为奇偶校验位。

2、变换密钥

(1)、舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。

(2)、将变换后的密钥分为两个部分,开始的28位称为C[0],最后的28位称为D[0]

(3)生成16个子密钥,初始I=1

(i)、同时将C[I]D[I]左移1位或2位,根据I值决定左移的位数。

(ii)、将C[I]D[I]作为一个整体按下表(PC-2)变换,得到48位的K[I]

(iii)、从1-2-3-1处循环执行,直到K[16]被计算完成。

()、处理64位的数据

1、取得64位的数据,如果数据长度不足64位,应该将其扩展为64位(例如补零)

2、将64位数据按下表变换(IP

3、将变换后的数据分为两部分,开始的32位称为L[0],最后的32位称为R[0]

4、用16个子密钥加密数据,初始I=1

(1)、将32位的R[I-1]按下表(E)扩展为48位的E[I-1]

(2)、异或E[I-1]K[I],即E[I-1] XOR K[I]

(3)、将异或后的结果分为86位长的部分,第1位到第6位称为B[1],第7位到第12位称为B[2],依此类推,第43位到第48位称为B[8]

(4)、按S表变换所有的B[J],初始J=1。所有在S表的值都被当作4位长度处理。

(i)B[J]的第1位和第6位组合为一个2位长度的变量MM作为在S[J]中的行号。
(ii)
、将B[J]的第2位到第5位组合,作为一个4位长度的变量NN作为在S[J]中的列号。

(iii)、用S[J][M][N]来取代B[J]

(iv)、从(i)处循环执行,直到B[8]被替代完成。

(5)、将B[1]B[8]组合,按下表(P)变换,得到P

(6)、异或PL[I-1]结果放在R[I],即R[I]=P XOR L[I-1]

(7)L[I]=R[I-1]

(8)、从2-4-1处开始循环执行,直到K[16]被变换完成。

5、、组合变换后的R[16]L[16](注意:R作为开始的32位),按下表(IP-1)变换得到最后的结果。

四、 实验步骤

利用编程语言实现DES加解密算法。

  1. 编程:包含的具体函数说明
  • int ByteToBit(ElemType ch, ElemType bit[8]); //字节转换成二进制
  • int BitToByte(ElemType bit[8], ElemType *ch); //二进制转换成字节
  • int Char8ToBit64(ElemType ch[8], ElemType bit[64]); //将长度为8的字符串转为二进制位串
  • int Bit64ToChar8(ElemType bit[64], ElemType ch[8]); //将二进制位串转为长度为8的字符串
  • int DES_MakeSubKeys(ElemType key[64], ElemType subKeys[16][48]); //生成子密钥
  • int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]); //密钥置换1
  • int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]); //密钥置换2
  • int DES_ROL(ElemType data[56], int time); //循环左移
  • int DES_IP_Transform(ElemType data[64]); //IP置换
  • int DES_IP_1_Transform(ElemType data[64]); //IP逆置换
  • int DES_E_Transform(ElemType data[48]); //扩展置换
  • int DES_P_Transform(ElemType data[32]); //P置换
  • int DES_SBOX(ElemType data[48]); //异或
  • int DES_XOR(ElemType R[48], ElemType L[48], int count); //S盒置换
  • int DES_Swap(ElemType left[32], ElemType right[32]); //交换
  • int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]); //加密单个分组
  • int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]); //解密单个分组
  • int DES_Encrypt(char *plainFile, char *keyStr, char *cipherFile); //加密文件
  • int DES_Decrypt(char *cipherFile, char *keyStr, char *plainFile); //解密文件
  1. 调试
  • 分别在程序目录下建立4个文件: 1.txt(明文)、key.txt(密钥)、2.txt(明文加密后的密文)、3.txt(密文解密后的明文)
  • 我的原文是:1234567,密钥是program,运行程序前先把他们写入文件中
  • 程序的结果输入到文件中
  1. 运行结果,启动程序,进入选择界面

  • 1:验证des算法
    • 这个选项,不做其他操作,有统计时间,然后把写入文件中

      当前文件夹下的输出结果:

  • 2:验证雪崩效应,这里会打印出二进制位
    • 原文是1234567的结果

    • 原文是1234568的结果:

    • 对比发现,密文变化很大
  • 3:验证执行时间,这里不打印二进制位串了,只是运行1000次统计时间

  • 其他:退出\n")
  1. 存盘

五、实验分析

  1. 实现des加解密的时间比较长,但是c语言的性能比java和c++等要好上很多
  2. 对于雪崩效应:如果更改原文的1位二进制位,密文会发生很大的变化
  3. 加密算法与CPU的运转速度是成线性关系的。或许使用多线程会更快

六、DES源程序

源代码在当前目录下,同时附有readme文件和输入输出文件。

这里也贴上代码:

#define _CRT_SECURE_NO_WARNINGS

0

收藏

wodeshijiecn

12篇文章,1W+人气,0粉丝