《信息安全DES和AES加密解密》课程设计.docx
- 文档编号:8921419
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:15
- 大小:258.99KB
《信息安全DES和AES加密解密》课程设计.docx
《《信息安全DES和AES加密解密》课程设计.docx》由会员分享,可在线阅读,更多相关《《信息安全DES和AES加密解密》课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
《信息安全DES和AES加密解密》课程设计
信息安全概论
院(系):
专业班级:
姓名:
学号:
日期:
地点:
指导教师:
成绩:
一、课程设计目标
1.通过信息安全课程设计,能够增强我们对信息安全的认识,更加牢固的掌握信息安全概论相关知识。
2.综合运用学习到的理论知识,提高实践能力。
3.通过小组讨论形式对任务进行分解,提出实现方案,制定计划,小组成员分工协作,共同完成课程设计题目,培养团队合作能力。
4.运用熟悉的程序语言编写程序,增强对程序语言的运用。
5.课程设计期间,通过对问题的分析查找资料,培养资料查询以及运用现代信息技术获取相关信息并进行归纳总结的基本能力。
6.与同学讨论,互相学习,提升个人学习能力。
二、课程设计内容
1课程设计的内容
1.1确定课程设计方向:
经过小组成员的商讨,确定了使用c#语言,编写一个对文件进行加密加密的小程序,运用DES算法,实现对文件的加密解密后,再添加一些小的功能,用AES算法,实现对字符串的加密解密。
1.2查阅资料:
通过查找文件加解密的资料以及查阅了相关的加密解密算法,学习了对文件加密解密的基本思路,与实现方法。
1.3界面设程序计:
设计一个整体界面,有三个按钮,其中两个分别实现对应文件的加密解密和字符串的加密解密,还有一个退出程序功能按钮。
1.4程序设计:
有了思路和方法,接着就借助c#语言分别实现对文件的加密解密,以及对字符串的加密解密小程序。
1.5后期调试:
程序实现后,对其进行调试,发现不合适的地方及时纠正。
1.6完成课程设计:
写课程设计报告,完成课程设计。
2原理介绍
2.1DES加密原理
DES使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。
这是一个迭代的分组密码,使用称为Feistel的技术,其中将加密的文本块分成两半。
使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
DES使用16个循环,使用异或,置换,代换,移位操作四种基本运算。
本程序中运用DESCryptoServiceProvider 类的部分属性或方法,从而达到使用des加密解密的目的。
2.1RSA加密原理
RSA公开密钥密码体制。
所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。
加密算法E和解密算法D也都是公开的。
虽然秘密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。
这就使加密的计算量很大。
为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。
对方收到信息后,用不同的密钥解密并可核对信息摘要。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
3开发环境及技术介绍
3.1开发环境:
MicrosoftVisualStudio2008
MicrosoftVisualStudio2008是面向WindowsVista、Office2007、Web2.0的下一代开发工具,代号“Orcas”,是对VisualStudio2005一次及时、全面的升级。
VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。
使用VisualStudio2008可以高效开发Windows应用。
设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。
同时VisualStudio2008支持项目模板、调试器和部署程序。
VisualStudio2008可以高效开发Web应用,集成了AJAX1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
3.2引用命名空间以及相关类
命名空间:
System.IO命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
System.Security.Cryptography 命名空间提供加密服务,包括对数据进行安全的编码和解码以及许多其他操作,如散列运算、随机数生成和消息验证等。
相关类:
FileStream类,是公开以文件为主的Stream,既支持同步读写操作,也支持异步读写操作。
CryptoStream的任何加密对象可以和实现Stream的任何对象链接起来,因此一个对象的流式处理输出可以馈送到另一个对象的输入。
不需要分别存储中间结果(第一个对象的输出)。
DESCryptoServiceProvider类,该类定义访问数据加密标准(DES)算法的加密服务提供程序(CSP)版本的包装对象。
4系统主要函数介绍(代码加上详细注释)
4.1DES对文件加密解密程序的主要函数:
//产生随机Byte数组用作IV初始向量
privatestaticRandomNumberGeneratorrand=newRNGCryptoServiceProvider();
privatebyte[]IV=GenerateRandomBytes(16);
//产生随机数组
privatestaticbyte[]GenerateRandomBytes(intcount)
{
byte[]bytes=newbyte[count];
rand.GetBytes(bytes);
returnbytes;
}
privatevoidbtnSelectFile_Click(objectsender,EventArgse)//选择文件路径
{
openFileDialog1.FileName="";
if(openFileDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
txtFileName.Text=openFileDialog1.FileName;
}
}
privatevoidbtnEncryptFile_Click(objectsender,EventArgse)//加密事件
{
stringinFile=txtFileName.Text;
stringoutFile=inFile+".dat";
stringword=txtPassword.Text+"*******";
if(word=="*******")
{
MessageBox.Show("请输入密码!
");
return;
}
stringstr=word.Substring(0,8);
byte[]password=Encoding.ASCII.GetBytes(str);
try
{
EncryptData(inFile,outFile,password,IV);
File.Delete(inFile);//删除加密前的文件
txtFileName.Text=string.Empty;
MessageBox.Show("加密成功");
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
privatevoidbtnDecryptFile_Click(objectsender,EventArgse)//解密事件
{
stringinFile=txtFileName.Text;
stringoutFile=null;
if(inFile.Length!
=0)
outFile=inFile.Substring(0,inFile.Length-4);
else
{
MessageBox.Show("空路径名师非法的,请选择文件路径!
");
return;
}
stringword=txtPassword.Text+"*******";//密码不足八位时,补足八位
if(word=="*******")
{
MessageBox.Show("请输入密码!
");
return;
}
stringstr=word.Substring(0,8);
byte[]password=Encoding.ASCII.GetBytes(str);
try
{
DecryptData(inFile,outFile,password,IV);
File.Delete(inFile);//删除解密前的文件
txtFileName.Text=string.Empty;
MessageBox.Show("解密成功");
}
catch(Exceptionex)
{
File.Delete(outFile);
MessageBox.Show(ex.Message);
return;
}
}
//DES加密算法
privatestaticvoidEncryptData(StringinName,StringoutName,byte[]desKey,byte[]desIV)
{
//创建文件流处理文件信息
FileStreamfin=newFileStream(inName,FileMode.Open,FileAccess.Read);
FileStreamfout=newFileStream(outName,FileMode.OpenOrCreate,FileAccess.Write);
fout.SetLength(0);
byte[]bin=newbyte[100];//暂时存储读取的数据
longrdlen=0;//写入到文件中的总长度
longtotlen=fin.Length;//读取的文件的总长度
intlen;//一次写入的长度
DESdes=newDESCryptoServiceProvider();
CryptoStreamencStream=newCryptoStream(fout,des.CreateEncryptor(desKey,desIV),CryptoStreamMode.Write);
//读取传入文件,并将信息加密写入到传出文件中
while(rdlen { len=fin.Read(bin,0,100); encStream.Write(bin,0,len); rdlen=rdlen+len; } encStream.Close(); fout.Close(); fin.Close(); } ///解密算法 privatestaticvoidDecryptData(StringinName,StringoutName,byte[]desKey,byte[]desIV) { FileStreamfout=null; FileStreamfin=null; CryptoStreamencStream=null; try { //创建文件流处理文件信息 fin=newFileStream(inName,FileMode.Open,FileAccess.Read); fout=newFileStream(outName,FileMode.OpenOrCreate,FileAccess.Write); fout.SetLength(0); byte[]bin=newbyte[100];//暂时存储读取的数据 longrdlen=0;//写入到文件中的总长度 longtotlen=fin.Length;//读取的文件的总长度 intlen;.//一次写入的长度 DESdes=newDESCryptoServiceProvider(); encStream=newCryptoStream(fout,des.CreateDecryptor(desKey,desIV),CryptoStreamMode.Write); //读取传入文件,并将加密信息写入到传出文件中 while(rdlen { len=fin.Read(bin,0,100); encStream.Write(bin,0,len); rdlen=rdlen+len; } encStream.FlushFinalBlock(); } catch {} finally { fout.Close(); fin.Close(); encStream.Close(); } } 4.2RSA加密解密字符串程序的主要代码: privatevoidbuttonEncrypt_Click(objectsender,EventArgse)//点击“加密” { textBoxEncrypted.Text=RSAEncrypt(textBoxInput.Text); } privatevoidbuttonDecrypt_Click(objectsender,EventArgse)//点击“解密” { textBoxDecrypted.Text=RSADescrpt(textBoxEncrypted.Text); } //使用RSA算法进行加密 privatestringRSAEncrypt(stringtext) { //从密钥容器中取出密钥提供器 RSACryptoServiceProviderrsa=GetRSAProviderFromContainer("rsa1"); byte[]bytes=Encoding.Unicode.GetBytes(text); byte[]encryptedData=rsa.Encrypt(bytes,true);//将数据进行加密工作 returnConvert.ToBase64String(encryptedData);//将加密后的字符数组转换成字符串 } //使用RSA算法进行解密 privatestringRSADescrpt(stringtext) { //从密钥容器中取出密钥提供器 RSACryptoServiceProviderrsa=GetRSAProviderFromContainer("rsa1"); //将要进行解密的字符串转换成字符数组 byte[]encryptedData=Convert.FromBase64String(text); //将加密数据encryptedData进行解密并将结果保存到decryptedData中 byte[]decryptedData=rsa.Decrypt(encryptedData,true); //将解密后的字符数组转换成字符串 returnEncoding.Unicode.GetString(decryptedData); } //获取初始化RSA对象 privatestaticRSACryptoServiceProviderGetRSAProviderFromContainer(stringcontainerName)// { CspParameterscp=newCspParameters(); //将ProviderType初始化为值24,该值指定PROV_RSA_AES提供程序 cp.ProviderType=24; //如果不存在名为containerName的密钥容器,则创建之,并初始化cp //如果存在,则直接根据它保存的内容初始化cp cp.KeyContainerName=containerName; RSACryptoServiceProviderrsa=newRSACryptoServiceProvider(cp); returnrsa; } //导出密钥 privatevoidbuttonExportKey_Click(objectsender,EventArgse) { RSACryptoServiceProviderrsa=GetRSAProviderFromContainer("rsa1"); stringrsaKeyInfo=rsa.ToXmlString(true); System.IO.File.WriteAllText("keyinfo.txt",rsaKeyInfo); MessageBox.Show("密钥信息成功导出到‘keyinfo.txt’中,请妥善保存该文件! "); } //导入密钥 privatevoidbuttonImprotKey_Click(objectsender,EventArgse) { //保存不对称密钥到密钥容器 SaveKeyInfoToContainer("rsa1"); MessageBox.Show("导入成功! "); } //将密钥信息保存到密钥容器中 privatestaticvoidSaveKeyInfoToContainer(stringcontainerName) { CspParameterscp=newCspParameters(); //将ProviderType初始化为值24,该值指定PROV_RSA_AES提供程序 cp.ProviderType=24; cp.KeyContainerName=containerName; stringrsaKeyInfo=System.IO.File.ReadAllText("keyinfo.txt"); RSACryptoServiceProviderrsa=newRSACryptoServiceProvider(cp); rsa.FromXmlString(rsaKeyInfo); //true表示将密钥永久驻留在csp中,false表示从密钥容器中删除该密钥 rsa.PersistKeyInCsp=true; } 5系统运行效果(截图) 5.1运行效果图: 整体界面: 字符串加解密界面: 文件加密解密界面: 5.2对文件加解密程序进行测试: 选择文件 对文件进行加密: 选择文件,进行解密: 解密成功之后,文件可以正常打开显示内容。 5.3加密字符串程序测试(B加密、A解密): A首先导出密钥,然后将导出的密钥发送给B,B用公钥来加密信息。 B得到公钥之后,先导入密钥,再将字符串进行加密。 对字符串进行解密 B用公钥加密完成后,将加密文本发送给A,A接收后对其进行解密。 三、课程设计总结 为期一周的课程设计结束了,回顾整个课程设计的过程,大体还算顺顺利利,虽然中间有遇到一些难题,但经过认真的查找资料以及虚心向同学请教,再加上耐心的调试,最终困难也就迎刃而解了。 这次课程设计做的主要是加密解密方面的内容,因此通过这将近一周的不断学习,不仅增加了对加密算法的一些理解,并且增强了我对信息安全的认识,也能够更加牢固的掌握信息安全概论的相关知识。 四、个人心得体会 经过这次《信息安全概论》的课程设计,我个人得到了不少的收获,一方面加深了我对课本理论的认识,另一方面也提高了实践操作能力以及团队协作能力。 我的此次课程设计是主要关于编写一个加密解密小程序,这也使得我更加扎实的掌握了有关于信息安全密码学的相关方面的知识。 在设计过程中虽然遇到了一些困难,但经过一次又一次的思考,一遍又一遍的检查终于找出了问题所在,也暴露出了前期我在这方面的知识欠缺和经验不足。 实践出真知,通过亲自动手制作,使我们掌握的知识得以实践。 过而能改,善莫大焉。 在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。 最终的检验修改环节,本身就是在践行“过而能改,善莫大焉”的知行观。 这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在不懈的努力下,终于迎刃而解。 在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 课程设计不仅是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思路,给了我莫大的空间。 同时,设计让我感触很深。 使我对抽象的理论有了具体的认识。 个人认为,在这近一周的的课程设计中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。 更重要的是,在课程设计过程中,我们学会了很多学习的方法。 而这是日后最实用的,真的是受益匪浅。 要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 这对于我们的将来也有很大的帮助。 以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。 回顾起此课程设计,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决 此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。 收获颇丰。 在我们的认识中,课程设计便是理论与实践相结合的过程。 在蔡老师的课堂中,我们学习了很多关于信息安全的知识,这让我们脑中有着很多“模型”,通过课程设计我们可以将其付诸
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息安全DES和AES加密解密 信息 安全 DES AES 加密 解密 课程设计