DES加密解密的实现.docx
- 文档编号:2775824
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:17
- 大小:47.93KB
DES加密解密的实现.docx
《DES加密解密的实现.docx》由会员分享,可在线阅读,更多相关《DES加密解密的实现.docx(17页珍藏版)》请在冰豆网上搜索。
DES加密解密的实现
成都信息工程学院
课程设计报告
DES加密解密的实现
课程名称:
应用密码算法程序设计
学生姓名:
曾胜
学生学号:
2008122112
专业班级:
信息安全2008级3班
任课教师:
张金全
2010年11月5日
附件:
课程设计成绩评价表
指导老师评阅成绩表
学习与工作态度(30%)
选题意义(10%)
文献综述(10%)
研究水平与设计能力(20%)
课程设计说明说(论文)撰写质量(20%)
设计创新(10%)
总分
指导老师签名:
年月日
课程设计答辩记录及评价表
学生
讲述情况
教师主要
提问记录
学生回答
问题情况
答辩评分
评分项目
分值
评价参考标准
评分
总分
优
良
中
及格
差
选题意义
10
9
8
7
6
4
文献综述
10
9
8
7
6
4
研究水平与设计能力
20
19
17
15
13
10
课程设计说明书(论文)撰写质量
20
19
17
15
13
10
设计创新
10
9
8
7
6
4
答辩效果
30
28
25
22
19
15
答辩小组成员签名
答辩小组组长签名:
年月日
课程设计成绩评定表
成绩汇总
评分项目
评分
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
50%
目录
1.背景与意义3
2.系统设计4
2.1系统主要目标4
2.2主要软件需求(运行环境)4
2.3功能模块与系统结构4
2.3.1密钥模块4
2.3.2加密模块5
2.3.3解密模块5
3系统功能程序设计5
3.1基本要求部分5
3.1.1初始置换IP5
3.1.2E盒扩展6
3.1.3与密钥进行异或6
3.1.4S盒变换6
3.1.5P置换运算7
3.1.6与左32位进行异或7
3.1.7逆IP置换8
3.1.8Des加密函数8
3.1.9密钥交换9
3.1.10Decode()解密函数10
3.2较高要求部分11
3.2.1分组加密实现11
3.2.2明文分组最后分组的填充11
3.3程序界面预览12
4.测试报告12
4.1密钥中间过程12
4,2加密过程中的各步结果13
4.3解密过程中的各步结果13
5结论14
参考文献14
1.背景与意义
DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。
在过去近20年的时间里,DES被广泛应用于美国联邦和各种商业信息的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。
但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。
虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。
在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加汕站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密伟输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
2.系统设计
2.1系统主要目标
基本要求部分:
1.能够对一个明文分组进行加密,加密后能够正确解密。
2.程序运行时可以输出任一组密钥。
因为实现了对任意长度明加密,所以没输出每一轮加密后的结果。
因为当明文长度过长时,每一轮加密结果会很多。
3.程序有良好的人机交互操作;
较高要求部分:
1.如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;
2.密钥采用ASCII码,明文输入信息可以是文字(可以是汉字或英文,要求不止一个加密分组长度),任意字符。
进行加密后,能够进行正确的解密;
3.程序代码有比较好的结构,模块划分合理,用类进行封装,通过调用类的成员函数实现加密解密功能。
2.2主要软件需求(运行环境)
本软件用C#语言编写,编写时所用的工具主要是VisualStudio。
编辑成功后的.EXE文件可以在装有windows系统的任何计算机上使用。
测试平台:
WindowsXPProfessional
使用软件:
MicrosoftVisualStudio2005
2.3功能模块与系统结构
该软件由三个模块构成;
2.3.1密钥模块
privatevoidKey(stringstr)//此函数用来获取密钥的数组
str是密钥字符串,最后得到钥密二进制数组.用一个类成员数组key来存放。
privatevoidKeyBuild()//此函数用来构造16轮子密钥
privatevoidKeycreate(int[]midkey2,intmovebit,intn)//此函数用来实现循环左移,同时进行PC2置换
上面二个函数用来产生16轮密钥,最后存放在类成员二维数组keyArray中。
privatevoidShowKey()//此函数用来显示密钥
2.3.2加密模块
privatevoidbutton2_Click(objectsender,EventArgse)//加密事件
加密事件包含了ArrayDes()函数;
privatevoidArrayDes()//此函数用来对明文分组加密
ArrayDes()包含PlainArray()、Key()、KeyBuild()、Keycreate()、ShowKey()和Des()函数,
privatevoidPlainArray(stringstr)//此函数用来获取明文字符串的二进制数组。
privatevoidDes(int[,]plain,int[]key,intn)//DES加密函数
2.3.3解密模块
privatevoidbutton4_Click(objectsender,EventArgse)//解密事件
privatevoidExchange()//此函数用来交换16轮密钥,把第一轮作最后一轮
privatevoidArrayDecode()//此函数用来分组解密
privatevoidEncodeArray(stringst)//此函数用来对16进制的密文转成二进制
privatevoidDecode(refint[,]plain,int[]key,intn)//解密函数
3系统功能程序设计
3.1基本要求部分
3.1.1初始置换IP
将IP盒分为左32位和右32位,将明文左32位和右32位分别进行IP置换,最后既实现了IP置换,同时还将明文分成了左32位和右32位,为下一步做好了准备。
for(i=0;i<32;i++)
{
lData[i]=Encode[IP1[i]-1];
rData[i]=Encode[IP1[i+32]-1];
}
循环变量i用来找到IP盒中下标为i的数,IP[i]取出该数,由于计算机中下标是从零开始计算的,而IP[i]表的是明文二进制中第几个数,所以应置换成明文二进制中第IP[i]-1那个数。
3.1.2E盒扩展
privatevoidEChange(refint[]rData,refint[]rDataP)
{
for(inti=0;i<48;i++)
{
rDataP[i]=rData[E[i]-1];
}
}
rData表示要传入的右32位二进制明文,rDataP表示经过E盒变化后的要传回的48位。
道理和IP置换差不多。
也是找到E盒中相应的数,然后减1找到rData中相应的数,然后存到rDataP中。
3.1.3与密钥进行异或
for(i=0;i<48;i++)
{
rDataP[i]=rDataP[i]^keyArray[k,i];
}
keyArray数组中存放的是16伦密钥,k表示第几伦,是从0开始计数的。
rDataP是从E盒中出来的48位二进,变化完后,依然存在rDataP数组中.
3.1.4S盒变换
for(i=0;i<48;i+=6)
{
n=i/6;
linex=(rDataP[i]<<1)+rDataP[i+5];
liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4];
FillBin(refrData,n,S[n,linex,liney]);
}
Linex变量指S盒的第几行,liney变量指S盒的第几列.“rDataP[i]<<1”表示左移一位。
先将rDataP[i]这个数转成二进制,再左移一位,并在最后加零。
相当于乘以2。
后面是同样的道理。
n=i/6;表示第几个S盒。
实例把101101代入:
linex=((rDataP[0]=1)<<1)+(rDataP[0+5]=1)=”10”+”1”=2+1=3;
同理可以算出liney=6;
FillBin()参数rData用来输出S盒变换后的32二进制,n第几个S盒,S[n,linex,liney]对应S盒中的相应数.
下面是FillBin的具体代码:
privatevoidFillBin(refint[]rData,intn,ints)
{
int[]temp=newint[4];
inti;
for(i=0;i<4;i++)//将S盒中的数转成四位二制数
{
temp[i]=s%2;
s=s/2;
}
for(i=0;i<4;i++)//将每次的四位二进制数存32位rData数组中
{
rData[n*4+i]=temp[3-i];
}
}
3.1.5P置换运算
for(i=0;i<32;i++)
{
temp[i]=rData[i];
}
先将经过S盒代替的32位存入temp[]数组中,主要原因是这里输入的32位和输出的32位都是存在rData[]数组中,如果用不同的数组来存放可以不用进行这一步。
for(i=0;i<32;i++)
{
rData[i]=temp[P[i]-1];
}
3.1.6与左32位进行异或
for(i=0;i<32;i++)
{
rData[i]=lData[i]^rData[i];
}
左322位与右32位异或后依然存放在rData[]数组中,作为下一轮的右32位输入.
3.1.7逆IP置换
privatevoidIP2Change(refint[]lData,refint[]rData,refint[]Encode)
{
int[]temp=newint[6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 加密 解密 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)