DES加密解密课程设计报告.docx
- 文档编号:882316
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:13
- 大小:25.42KB
DES加密解密课程设计报告.docx
《DES加密解密课程设计报告.docx》由会员分享,可在线阅读,更多相关《DES加密解密课程设计报告.docx(13页珍藏版)》请在冰点文库上搜索。
DES加密解密课程设计报告
成都信息工程学院
课程设计报告
DES算法加密与解密的设计与实现
课程名称:
密码算法程序设计
学生姓名:
学生学号:
专业班级:
任课教师:
XX年XX月XX日
指导老师评阅成绩表
学习与工作态度(30%)
选题意义(10%)
研究水平与设计能力(25%)
课程设计说明说(论文)撰写质量(25%)
设计创新(10%)
总分
指导老师签名:
年月日
课程设计答辩记录及评价表
学生
讲述情况
教师主要
提问记录
学生回答
问题情况
答辩评分
评分项目
分值
评价参考标准
评分
总分
优
良
中
及格
差
选题意义
10
9
8
7
6
4
研究水平与设计能力
25
23
20
18
15
10
课程设计说明书(论文)撰写质量
25
23
20
18
15
10
设计创新
10
9
8
7
6
4
答辩效果
30
28
25
22
19
15
答辩小组成员签名
答辩小组组长签名:
年月日
课程设计成绩评定表
成绩汇总
评分项目
评分
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
50%
1背景1
1.1DES算法概述1
1.2DES算法描述1
2系统设计3
2.1系统主要目标3
2.2系统运行环境4
3功能需求分析4
3.1整体功能分析4
3.2DES算法一轮的功能分析4
4模块划分5
4.1初始置换5
4.2轮结构6
4.2.1E盒扩充变换6
4.2.2S盒压缩变换7
4.2.3P盒置换7
4.3逆初始置换8
5程序分模块实现8
5.1将字符串转换成二进制流8
5.2子密钥的产生9
5.3F函数的计算9
5.416轮加密的实现10
5.5把密钥,密文,明文的二进制转换为10进制11
5.6解密的实现11
5.7程序运行界面预览11
6测试报告11
6.1程序总体运行情况12
6.2密钥中间过程12
6.3加密过程的中间结果13
6.4解密过程的中间结果14
7课程报告总结14
1背景
1.1DES算法概述
DES(DataEncryptionStandard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。
然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。
所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。
它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16轮的替换和移位后,输出完全不同的64比特密文数据。
由于DES算法仅使用最大为64比特的标准算法和逻辑运算,运算速度快,密钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。
1.2DES算法描述
DES算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为64比特的块。
图1-1是DES加密算法的加密流程。
图1-2是密钥扩展处理过程。
图1-1DES加密算法流程
图1-2子密钥产生流程
2系统设计
2.1系统主要目标
(1)用C++设计一个DES加密/解密软件系统;
(2)完成一个明文分组的加解密,明文和密钥是ASCII码,长度都为8个字符,输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;
(3)程序运行时,要求输出第15、16轮的密钥,以及第15、16轮加密或解密之后的值,16进制表示;
(4)程序有良好的人机交互操作;
(5)要求从两个文件分别读取明文和密钥,并在程序中输出明文及密钥;
(6)要求提供所设计系统的报告及完整的软件。
2.2系统运行环境
本软件用C语言编写,编写时所用的工具主要是MicrosoftVisualC++6.0。
编辑成功后的.EXE文件可以在装有windows系统的任何计算机上使用。
测试平台:
Windows7旗舰版
使用软件:
MicrosoftVisualC++6.0
3功能需求分析
3.1整体功能分析
3.2DES算法一轮的功能分析
4模块划分
4.1初始置换
首先输入64比特的明文块,按照初始置换(IP)表进行置换,DES初始置换表如图3-1所示。
图4-1初始置换表
4.2轮结构
经过DES算法第一阶段的初始置换得到的64比特块分为两部分,前32位为左半部分,后32位为右半部分,如上面图3-2所示,DES算法的论结构分为左右两部分32比特在每一轮中被独立处理。
具体过程为:
下一轮左半部分32比特
等于上一轮右半部分32比特
;而下一轮右半部分的32比特
的计算则是由上一轮右半部分
和轮密钥
输入到F函数中进行变换,变换结果与上一轮左半部分
进行异或运算,得到
。
因此每一轮的变换可由下面公式表示:
4.2.1E盒扩充变换
将右半部分的32比特,进行E盒扩展,扩展成为48比特。
具体变换过程为把输入的32比特按照8行4列方式依次排列,形成一个8*4矩阵,然后E盒扩展之后输出8*6矩阵。
图4-2E盒扩展
4.2.2S盒压缩变换
将E盒的输出与子密钥进行异或得到的48比特作为S盒的输入,进入S盒变换,48比特压缩为32比特。
S盒的安全性能是保证DES算法安全性的源泉,DES算法共有8个不同的S盒,每个S盒接受6位输入,输出4位。
8个S盒如下:
4.2.3P盒置换
S盒输出的32比特经过P盒置换,重新编排32比特的位置。
下图为P盒置换过程。
图4-3P盒置换
4.3逆初始置换
DES算法进行完16轮运算之后,需要进行逆初始置换,逆初始置换正好为初始置换的逆,如一个矩阵进行初始置换之后输出,在进行依次逆初始置换的输出结果为初始矩阵。
5程序分模块实现
5.1将字符串转换成二进制流
用ToBin()函数把输入的明文、密钥、密文转换为二进制流,其中p是输入的字符串,b是转换后的二进制流。
voidTo2Bin(charp[],intb[]){
inti=0,k=0;
for(i=0;i<8;i++)
{
intj=0x80;
for(;j;j>>=1)
{
if(j&p[i])
{
b[k++]=1;
}
else
{
b[k++]=0;
}
}
}
}
5.2子密钥的产生
子密钥产生函数:
SubKey(),其中参数K0为输入的密钥。
用到Replacement()函数,此函数实现密钥PC_1置换,和PC_2置换。
Lif_move()函数实现每一轮的左移位功能。
voidSubKey(intK0[])//子密钥产生函数
{
inti=0;
intK1[56],K2[56];
intC[17][28],D[17][28];
Replacement(K0,PC_1,K1,56);//密钥置换PC_1
for(i=0;i<28;i++)//将PC_1输出的56比特分为左右两部分
{
C[0][i]=K1[i];
D[0][i]=K1[i+28];
}
i=0;
while(i<16)
{
intj;
lif_move(C[i],C[i+1],move_times[i]);
lif_move(D[i],D[i+1],move_times[i]);
for(j=0;j<28;j++)
{
K2[j]=C[i+1][j];
K2[j+28]=D[i+1][j];
}
Replacement(K2,PC_2,K[i],48);//密钥置换PC_2
i++;
}
}
5.3F函数的计算
F函数为加密做准备,其中的Replacement()实现E盒扩展,P盒置换。
S_compress()函数实现S盒的压缩变化。
voidF_Function(inta[32],intb[32],intn)//F函数
{
inti;
inttmp[48];
inttep[32];
Replacement(a,E_Table,tmp,48);
for(i=0;i<48;i++)
{
tmp[i]=tmp[i]^K[n][i];
}
S_compress(tmp,tep);
Replacement(tep,P_Table,b,32);
}
5.416轮加密的实现
Encryption()函数实现16轮加密,其中F_Function()函数即为F函数。
voidEncryption(intm0[64],intc1[64])
{
inti,k;
intarry[32];
intc0[64],m1[64];
Replacement(m0,IP_Table,m1,64);//初始置换IP
for(i=0;i<32;i++)
{
L[0][i]=m1[i];
R[0][i]=m1[i+32];
}
k=1;
while(k<17)
{
F_Function(R[k-1],arry,k-1);
for(i=0;i<32;i++)
{
L[k][i]=R[k-1][i];
R[k][i]=L[k-1][i]^arry[i];
}
k++;
}
for(i=0;i<32;i++)
{
c0[i]=R[16][i];
c0[i+32]=L[16][i];
}
Replacement(c0,IP_1_Table,c1,64);//逆初始置换
}
5.5把二进制转换为10进制
转换为十进制是为输出16进制做准备,To10()函数把每四个字节转换成一个10进制数。
5.6解密的实现
解密函数Decryption(),解密过程中先有change()函数把密钥互换,然后用和加密相同的算法则可正确解密。
5.7程序运行界面预览
可根据需要选择加密和解密,加密又可选择直接输入明文和密钥或是从文件读取明文和密钥。
6测试报告
6.1程序总体运行情况
加密情况:
6.2密钥中间过程
16轮子密钥如下:
子密钥生成过程中的值:
经过测试这些函数,能够得到正确的16轮密钥
6.3加密过程的中间结果
初始二进制明文和密钥:
初始IP:
第一轮E盒扩展结果:
第一轮S盒输出:
第一轮P盒置换结果:
IP逆置换:
经过对个函数的测试,能正确加密。
6.4解密过程的中间结果
解密的密钥还是加密时的密钥,得到16轮子密后,将顺序全部颠倒一下。
因为解密过程与加密过相返。
准备解密的密文:
初始IP:
第一次E盒扩展:
第一次S盒压缩:
第一次P盒置换:
解密后的二进制结果:
经过对个函数的测试,能正确加密。
7课程报告总结
通过这次程序设计,我学到了很多东西,首先更深入的理解了DES算法,不仅完完全全弄懂了DES算法的各个过程,像密钥产生过程中的左移位、S盒的压缩变换等,也能一一实现。
其次也提高了编程技巧,在处理一些问题时能选择较佳的方法。
因为在做这个软件的时候看了很多别人的代码,所以我还是学到了不少东西,我看到别人的封装更好,代码也整洁,使用一些更好的实现方法。
再看我代码,我就感觉我的代码重用率很差。
还有一些编程方面的习惯也不太好。
通过此次实践我发现很多不足,以后还要去弥补这些不足。
参考文献:
[1]谭浩强 C程序设计(第三版)清华大学出版社 2009
[2] 张世斌万武南张金全 孙宣东现代密码学 西安电子科技大学出版社 2009
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 加密 解密 课程设计 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)