抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

DES实验报告

一、实验题目

DES加密算法


二、实验目的和要求

通过实验,掌握DES密码的程序实现,熟悉比特串的操作,矩阵变换,提高C++程序设计能力。

编写 DES 密码的加密解密程序,运行并验证。 (1) 输入 64 比特明文和密文,利用 DES 密码对其加密并输出密文。 (2) 输入 DES 加密的 64 比特密文和密钥,对其进行解密。 (3) 记录调试和验证过程,完成实验报告。


三、实验环境

clion


四、实验内容

DES 算法包括: (1):一个初始置换 IP:重排明文分组的 64 比特数据 (2):相同功能的 16 轮变换:每轮中都有置换和代换运算,第 16 轮变换的输出 分为左右两半,并被交换次序 (3):经过一个逆初始置换 IP-1(为 IP 的逆)。最后产生 64 比特的密文。

  1. 给定的 DES 结构如图:

  1. 每轮的结构如图:

32 比特扩展 48 位, 轮密钥异或, S 盒代换(1,6 位合并选行,2-5 位合并选列), 置换 P

  1. 轮密钥生成:

输入算法的 56 比特有效密钥: 1.首先经过一个置换运算(实际初始密钥共 64 位,去除 8 个校验位并且改变 顺序), 2.然后将置换后的 56 比特分为各为 28 比特的𝐶𝐶0和𝐷𝐷0两半。第𝑖𝑖轮𝐶𝐶𝑖𝑖−1和𝐷𝐷𝑖𝑖−1,分别左循环移位。得到𝐶𝐶𝑖𝑖和和𝐷𝐷𝑖𝑖−1 做为求下一轮子密钥的输入,同时也输入置换选择 2。 3.置换选择 2 产生的 48 比特的 ,即为本轮的子密钥,输入函数。

验证操作

  1. 选择进行文件加密,输入长度为 8 个字符的加解密的密钥,读入明文文件 1.txt,加密文件存储在 2.txt 文件中;
  2. 选择进行文件解密,输入长度为 8 个字符的加解密的密钥,读入密文文件 2.txt,解密文件存储在 3.txt 文件中。

五、算法描述及实验步骤

准备部分的矩阵:初始置换IP,逆初始置换IP,E表,置换函数P。

F中的代换由8个S盒组成。64比特密钥进行第一轮置换选择,变为56比特的有效密钥。分成两组后,左移位,再进入置换选择2.

将字符转为二进制的形式,与密钥参与异或运算

DES明文处理的过程有三个阶段:

1.初始置换IP:重排明文分组的64比特数据

2.16轮变换:每轮中包含置换、代换。变换的输出被分为左右两组,被交换次序

3.逆初始置换IP,产生密文

DES密钥生成:

1.56比特密钥经过置换

2.将置换后的56比特,分为两组,Ci、Di。

3.第i轮Ci-1、Di-1分别左移位。得到的Ci、Di作为下一轮求子密钥的输入,同时输入置换选择2

4.置换选择2生成48比特子密钥Ki,输入到F函数

轮结构:

$$L_i=R_{i-1}$$

$$R_i=L_{i-1}\oplus F(R_{i-1},K_i)$$

F的处理过程:

$$(R_{i-1}扩展/置换(E表)\oplus K_i)\ 进入S盒,变为32比特。置换(P),$$

六、调试过程及结果(附截图)

七、总结体会

❓任选两个模块描述执行过程

‼️明文的处理:

将字符转换为二进制,后面方便与密钥进行异或运算

1
2
3
4
5
6
7
int ISD_DES_ByteToBit(ElemType ch, ElemType bit[8]){
int cnt;
for(cnt = 0;cnt < 8; cnt++){
*(bit+cnt) = (ch>>cnt)&1;
}
return 0;
}

一字节长度为8比特:将其转换为二进制串

1
2
3
4
5
6
int ISD_DES_Char8ToBit64(ElemType ch[8],ElemType bit[64]){
int cnt;
for(cnt = 0; cnt < 8; cnt++){
ISD_DES_ByteToBit(*(ch+cnt),bit+(cnt<<3));
}
return 0;

‼️明文的加密:

1.初始置换IP:重排明文分组的64比特数据

2.16轮变换:每轮中包含置换、代换。变换的输出被分为左右两组,被交换次序

3.逆初始置换IP,产生密文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int ISD_DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){
ElemType plainBits[64];
ElemType copyRight[48];
int cnt;

ISD_DES_Char8ToBit64(plainBlock,plainBits);
//初始置换(IP置换)
ISD_DES_IP_Transform(plainBits);

//16轮迭代
for(cnt = 0; cnt < 16; cnt++){
memcpy(copyRight,plainBits+32,32);
//将右半部分进行扩展置换,从32位扩展到48位
ISD_DES_E_Transform(copyRight);
//将右半部分与子密钥进行异或操作
ISD_DES_XOR(copyRight,subKeys[cnt],48);
//异或结果进入S盒,输出32位结果
ISD_DES_SBOX(copyRight);
//P置换
ISD_DES_P_Transform(copyRight);
//将明文左半部分与右半部分进行异或
ISD_DES_XOR(plainBits,copyRight,32);
if(cnt != 15){
//最终完成左右部的交换
ISD_DES_Swap(plainBits,plainBits+32);
}
}
//逆初始置换(IP^1置换)
ISD_DES_IP_1_Transform(plainBits);
ISD_DES_Bit64ToChar8(plainBits,cipherBlock);
return 0;
}

评论