C语言实现DES算法实验报告.doc
文本预览下载声明
xx 大学
实验报告
报告题目:
课程名称:
任课教员:
专
学
姓
业:
号:
名:
DES 加密算法
密码学 B
年 月 日
一、课程概述
目的:培养学员的编程能力,理解算法原理。
要求:给出 DES 算法的软件实现,测试
DES 的加密速度。
二、设计思路
使用 C++ 语言进行编程,简化了输入输出语句。预处理时加入了
用了 std 名字空间。
加密时程序输入的明文是
脱密时程序输入的密文是
8 个 ascii 码,生成一个 16 个 16 进制数的密文。
16 个 16 进制数,生成一个 8 个 ascii 码的明文。
iostream 包。使
加脱密所用密钥均由 16 个 16 进制数组成。
其中 16 进制数全部使用大写字母。
程序中大量使用了的布尔数组,一个
bool 型变量只占用一位存储空间,比
int 型、
char 型变量要小的多。这降低了程序的空间复杂度。
三、采取的方案
本程序是将一个由 8 个 ascii 码组成的明文分组加密,生成一个由
组成的密文。或将一个由
码组成的明文。所用密钥由
16 个 16 进制数
8 个 ascii
16 个 16 进制数组成的密文进行脱密,生成一个由
16 个 16 进制数组成。
本实验按照输入数据及初始置换、
据四个步骤实现加密算法设计。
1、输入数据及初始置换
16 圈迭代、子密钥生成和逆初始置换及输出数
本程序首先会提示用户输入加密脱密识别码,加密输入
1,脱密输入 0,将此识别
码存入整形变量 o。根据 o 的不同值,提示用户输入 8 个字符(加密)或 16 个 16 进制
数(脱密)。输入的明文或密文转化为二进制数后储存到布尔型数组
初始置换通过函数 IP 完成,函数输入为原始明文
m[65] 中。
m,函数将输出结果保存到布尔
型数组 mip[65] 中。函数思想为查表, 含有一个整形变量数组 ip[64] ,保存初始变换表 IP。
将 mip 的第 i 位赋值为 m 的第 ip[i] 位。
2、子密钥生成
输入 16 个 16 进制数的密钥后,将密钥保存在一个
16 位字符数组 c 中,通过
ToEr 函数将之变为二进制数。 ToEr 函数输入为字符数组, 通过 switch 语句逐个检查字
符数组的每一位,将对应的四位二进制数存在
64 bit 密钥去掉每个字节的最高位得到
C0
和
D0
64 位布尔数组 k 中。
56 bit 密钥输入,通过置换选择
1 变换得到
各 28 bit,通过 Zhihuan_1 函数实现置换选择一。 Zhihuan_1 函数输入为二进
制密钥数组 k[64] ,输出为 C0 和 D0 ,将 C0、 D0 分别储存在 28 位布尔数组 C、 D 中。
函数采用查表方式生成
C0 和 D0 。
根据迭代的轮数确定 C 和 D 移位循环的位数, 主程序中利用一个 16 位整形数组来
存放每一次循环左移的位数。循环左移通过
XunHuan 函数实现,函数输入为循环位数
和长度为 28 的布尔数组( C 或者 D),函数运行一次只能改变一个布尔数组的值。为了
减低编程复杂度,程序使用串行方法,分两次进行
C、 D 的移位。
zhihuan_2 函
每完成一次 C 和 D 的移位,进行一次置换选择二。置换选择二利用
数完成。思想和 Zhihuan_1 函数类似。zhihuan_2 函数输入为移位后的 C、 zhihuan_2D,
函数将圈子密钥存放在
16*48 的二维布尔数组 kk[17][49] 中。 kk[i][48] 表示第 i 圈的圈
子密钥。原理图如图 1 所示。
脱密( o=0 时)需要将圈子密钥交换,此时可利用
义新的变量减少了系统开销。
kk[0][49] 充当中间变量,无需定
密钥
置换选择
56
28
28
1
C
0
D
0
移位循环
C
移位循环
D1
1
置换选择
移位循环
C
2
2
48
k1
移位循环
D
2
置换选择
2
48
k2
移位循环
C
移位循环
D
16
16
置换选择
2
48
k 16
图 1 圈子密钥生成算法
3、16 圈迭代
DES 的每一圈迭代采用的是
Feistel 模型,先将初始置换后的明文
mip 数组分成 L
和 R 两部分,先将 R 的内容放在等长的布尔数组
之后进入 F 函数, F 函数原理如图 2。
R=a 1 a 2 …a32
T 中,最后时需要将 L 的值赋为 T。
E
a’ a’ … a’1248
K=k
1
k 2 …k48
S1
S2
S3
S4
S5
S6
S7
S8
P
图2
F 函数原理图
R、圈子密钥 kk、迭代圈数 i。输
程序中的 F 函数输入有初始置换结果的右半部分
出保存在 R 中。先将输入的 R 通过查表的方法进行 E 拓
显示全部