网络与信息安全课程设计报告.doc
- 文档编号:2154147
- 上传时间:2023-05-02
- 格式:DOC
- 页数:18
- 大小:126KB
网络与信息安全课程设计报告.doc
《网络与信息安全课程设计报告.doc》由会员分享,可在线阅读,更多相关《网络与信息安全课程设计报告.doc(18页珍藏版)》请在冰点文库上搜索。
《网络与信息安全》课程设计报告
《网络与信息安全》课程设计报告
班级:
07网络工程(3)班
学号:
310709040308
姓名:
韩立伟
题目:
加密软件的设计
评阅:
成绩:
2010-1-07
17
RSA算法加密软件的设计
摘要:
分析RSA算法的应用现状,论证文件加密应用RSA算法的可行性和意义。
设计一套完整实用的RSA文件加密解决方案,具体编码实现。
对RSA算法进行研究,从常规RSA算法出发,用C#实现RSA加密算法类库,并在32位windows平台封装成组件。
在.Net平台引用此组件,实现可以对任意文件进行RSA加密操作的窗体应用程序。
经过加密的文件以及密钥文件都是文本文件。
给出关键类类图、整个应用程序的结构描述文档、关键模块流程图、较详细的接口文档、所有源代码。
对应用程序进行测试,对测试结果进行分析研究,进而对应用程序进行改进,对关键算法进行尽可能的优化,最终得到一个在windows运行的可以用指定密钥对任意文件进行RSA加密并可解密的完整应用程序,和一些相关的可移植组件。
关键词:
RSA,RSA算法,文件加密,加密成文本
目录
第1章RSA应用现状及应用于文件加密的分析……………….4
1.1RSA算法介绍与应用现状………………………………………….4
1.2RSA应用于文件加密的分析……………………………………….5
1.2.1文件加密使用RSA的可行性......................................5
1.2.2文件加密使用RSA的意义 6
第2章RSA文件加密软件的设计与实现………………………7
2.1需求分析与总体设计 7
2.1.1功能分析 7
2.1.2工程方案选择 8
2.2各部分的设计与开发 10
2.2.1实现RSA加密算法的C#核心类库 10
3.2测试数据与分析改进 14
3.2.1密钥生成测试 14
3.2.2数据输入输出测试 16
3.2.3加密解密测试 16
总结与体会……………………………………………………….17
致谢……………………………………………………………….17
参考文献…………………………………………………………17
前言
RSA公钥加密算法是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也十分流行。
算法的名字以发明者的姓氏首字母命名:
RonRivest,AdiShamir和LeonardAdleman。
虽然自1978年提出以来,RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击,至今(2007年)未被完全攻破。
随着越来越多的商业应用和标准化工作,RSA已经成为最具代表性的公钥加密技术。
VISA、MasterCard、IBM、Microsoft等公司协力制定的安全电子交易标准(SecureElectronicTransactions,SET)就采用了标准RSA算法,这使得RSA在我们的生活中几乎无处不在。
网上交易加密连接、网上银行身份验证、各种信用卡使用的数字证书、智能移动电话和存储卡的验证功能芯片等,大多数使用RSA技术。
当今公钥加密更广泛应用于互联网身份认证,本课题将公钥加密算法RSA应用于小型文件加密。
将任意文件加密成文本的解决方案,使其使用更加灵活。
整个工程的分层设计,给引用移植和后续开发带来便利。
第1章RSA应用现状及应用于文件加密的分析
1.1RSA算法介绍与应用现状
RSA算法可以简单叙述如下:
<密钥生成>
取素数p,q,令n=p×q.
取与(p-1)×(q-1)互素的整数e,
由方程d×e=1(mod(p-1)×(q-1))解出d,
二元组(e,n)作为公开密钥,
二元组(d,n)作为私有密钥.
<加密解密>
b=aemodn,c=bdmodn.
附录中给出了证明a=c(modn).
RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛认可和应用。
发展至今,电子安全领域的各方面已经形成了较为完备的国际规范。
RSA作为最重要的公开密钥算法,在各领域的应用数不胜数。
RSA在硬件方面,以技术成熟的IC应用于各种消费类电子产品。
RSA在软件方面的应用,主要集中在Internet上。
加密连接、数字签名和数字证书的核心算法广泛使用RSA。
日常应用中,有比较著名的工具包OpenSSL(SSL,SecuritySocketLayer,是一个安全传输协议,在Internet上进行数据保护和身份确认。
OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的EricYang等发起编写的。
相关详细介绍见http:
//www.openssl.org/about/)。
OpenSSL应用RSA实现签名和密钥交换,已经在各种操作系统得到非常广泛的应用。
另外,家喻户晓的IE浏览器,自然也实现了SSL协议,集成了使用RSA技术的加密功能,结合MD5和SHA1,主要用于数字证书和数字签名,对于习惯于使用网上购物和网上银行的用户来说,几乎天天都在使用RSA技术。
RSA更出现在要求高度安全稳定的企业级商务应用中。
在当今的企业级商务应用中,不得不提及使用最广泛的平台j2ee。
事实上,在j2se的标准库中,就为安全和加密服务提供了两组API:
JCA和JCE。
JCA(JavaCryptographyArchitecture)提供基本的加密框架,如证书、数字签名、报文摘要和密钥对产生器;JCA由几个实现了基本的加密技术功能的类和接口组成,其中最主要的是java.security包,此软件包包含的是一组核心的类和接口,Java中数字签名的方法就集中在此软件包中。
JCE(JavaCryptographyExtension)在JCA的基础上作了扩展,JCE也是由几个软件包组成,其中最主要的是javax.crypto包,此软件包提供了JCE加密技术操作API。
javax.crypto中的Cipher类用于具体的加密和解密。
在上述软件包的实现中,集成了应用RSA算法的各种数据加密规范(RSA算法应用规范介绍参见:
,这些API内部支持的算法不仅仅只有RSA,但是RSA是数字签名和证书中最常用的),用户程序可以直接使用java标准库中提供的API进行数字签名和证书的各种操作。
单机应用程序使用RSA加密尚比较少见,例如使用RSA加密任意一个文件。
1.2RSA应用于文件加密的分析
1.2.1文件加密使用RSA的可行性
通过1.1节的论述,不难看出RSA当今的应用多在于数字签名和证书等方面。
之所以只应用于这些短小数据的加密解密,是因为RSA算法加密极慢,速度是DES对称密钥加密速度的千分之一左右。
正是因为这样,把RSA应用于普通文件加密的想法一直被忽略。
通常文件被想象成大数据块,但是实际上在日常应用中,有些极其重要的文本资料是并不太大的,比如因担心遗忘而用普通文本记录的银行帐号和密码、不应被陌生人知道的重要电话号码、几千字节大的重要小图片等。
其实从一个简单的角度来说,既然RSA用于数字签名可行,那就完全可以用于同样大小的普通文件。
对于较大的文件,如果分成与数字签名同样大小的段(这里假设数字签名较短,不分段一次计算加密完成),分开的各段逐一进行加密运算,那所需要的时间也只是按文件大小线性的增长。
通常数字签名为几十字节,加密运算并不需要很长的等待,这就说明对于几百字节或一两K字节大小的文件来说,如果进行RSA加密,并不会是非常漫长的工作。
当然,如果文件更大,加密就显得十分漫长了。
比如按前面叙述的45毫秒大数运算程序推理,加密1M字节大小的文件需要约1天的时间。
所以,要在普通PC用几百位以上的长密钥RSA加密文件,文件不能过大,一般可以接受的上限是几KB。
如果要在较短时间内加密大文件,需要缩短密钥长度以减小运算量,这将带来安全性隐患。
本文的第3章将根据实际调试好的软件,测试给出具体的时间消耗数据。
例如,在一台配置为AMDAthron2800+,外频333MHZ,物理内存512MB的PC上测试实现的软件,以560bit的n逐字节加密一个1KB大小的文件需要55秒。
通常记录如银行帐号密码等重要数据的文本文件大小不足百字节,加密只需要数秒钟。
所以对于小型文件,进行较长密钥的RSA加密是完全可行的。
1.2.2文件加密使用RSA的意义
如1.2.1节所述,小型文件加密可以使用RSA。
比如,因担心遗忘而用普通文本记录的银行帐号和密码、不应被陌生人知道的重要电话号码、几千字节大的重要小图片等。
可行的方法未必是必要的,本小节讨论何种文件适合用非对称密钥加密,即RSA加密文件的意义所在。
对于前面叙述的带有重要信息的小型文本和二进制数据的维护,①如果不加密,将无法放心的保存在计算机上,尤其是连网的或机房里的公共计算机。
②如果借助功能强大的大型多用户数据保护程序维护几个小型文件,显得十分烦琐,好比杀鸡用牛刀。
③如果采用对称密钥加密,即加密解密的密钥相同,只适合部分情况。
在某些情况下,使用对称密钥加密文件,交流使用不够方便。
比如,张三由于某种原因,需要将自己的某个文件在公共计算机上留给李四,而不希望别人看到内容。
如果采用对称密钥加密,张三和李四提前约好一个密码就可以。
但是如果张三想要在同一台公共计算机上再留一个秘密文件给王五,而不希望别人看到,就要和王五另外约定一个密码。
如果需要在这台公共计算机上留十个文件给不同的人,自己就要记和十个人约定好的密码,这样以来交流起来不够方便,因为对于张三,要自己维护太多的密钥。
非对称密钥(公开密钥方式)恰好解决这样的问题。
只要大家都在这台计算机或这台计算机可以访问到的地方,留下自己的公开密钥,一切就变的容易解决了。
张三要留给李四的文件,就用李四的公开密钥加密,要留给王五的文件,就用王五的公开密钥加密。
李四和王五只要把留给自己的文件用自己的私有密钥解密,就可以得到留给自己的文件了。
显然,非对称密钥体制更适合多用户交流,而将这种加密方式直接应用于文件加密,使我们在公开场合的交流更加灵活方便。
一种更实际的情况是,我们想通过Internet上的公众论坛或邮件发送重要保密信息给某人。
例如发送一个银行帐号和密码给某人。
这种情况要保证安全,在当今互联网络上是比较棘手的。
①如果用公众论坛直接留言给指定用户,论坛管理员和服务器管理员通常有方法看到数据。
②如果发送邮件,虽然传送过程是加密的,但是密码毕竟是由邮件服务器维护,所以系统管理员通常也有办法看到内容。
问题的关键在于我们所有的数据包括密钥保存在服务器之上。
在这种情况下,我们需要使用公开密钥方式,并自己维护私有密钥。
RSA文件加密可以灵活的解决这些问题。
例如,我们可以将任意一个文件用某人的公开密钥加密变换成一段可以复制粘贴的文本,然后粘贴在公众互联网上,对方只需把需要解密的文本复制保存成一个文本文件,在本地机用自己的私有密钥解密即可。
我们可以将自己的私有密钥通过DES加密后保存在自己的移动磁盘上,使用的时候只要将其解密读取即可,用完后立即从当前操作环境清除。
这样,我们自己维护自己的私有密钥,利用简单并且公开的方式,可以安全传送任意小型数据,包括一切二进制文件。
所以,对于使用小型文件进行数据交换的情况,更好的方案是通过一个小型应用程序对这些文件进行非对称密钥加密。
为了适合前面叙述的在公共BBS与特定的某人交流重要保密信息的情况,加密生成的数据应该是文本,这样可以方便复制粘贴。
综上所述,使用前面叙述的方式加密文件有两点重要意义:
①应用非对称密钥加密任意文件,使非对称密钥的应用不仅仅局限于互联网络。
②非对称加密后的数据变换成文本,使得我们可以通过几乎任何方式安全传递任意文件,比如在只有http的环境使用xml方式。
第2章RSA文件加密软件的设计与实现
2.1需求分析与总体设计
2.1.1功能分析
经过1.2.2节的论述,我们可以将对软件的要求总结如下:
① 可以按要求的位数生成非对称密钥。
② 可以保存密钥和装载密钥,密钥保存为纯文本。
③ 可以用指定密钥以RSA算法加密任意一个文件,加密生成的数据为纯文本。
④ 可以装载加密过的文件,并用指定的密钥解密还原出原文件。
⑤ 提示信息完整、操作舒适、图形界面雅观
按上述描述,给出UseCase和Statechart如图2-1。
图2-1本项目的UseCase和Statechart
根据以上分析,一般来说,需要进行编码的程序有
①RSA密钥生成②RSA加密解密③任意文件的读取和保存操作④各环节必要的数据编码转换⑤图形操作界面。
2.1.2工程方案选择
结合现有的常见开发模式综合分析,有多种实现方案,下面陈述其中几种,并分析选择一种解决方案,并给出工程框架。
(1.) 整个工程使用java平台实现
RSA密钥生成、RSA加密解密的功能实现十分简单,因为标准库中集成几乎所有功能,不需要从RSA算法出发进行编码。
在j2se标准库中,javax.crypto中的Cipher类用于具体的加密和解密,java.security包直接提供了数字签名的相关方法。
因为有强大的标准库支持,文件的读取和保存操作、各环节必要的数据编码转换、图形操作界面的实现也很简单(使用java.iojava.awt或javax.swing等包),如果结合一种快速开发的IDE,比如JBuilder,整个软件可以在很短的时间内编码完成。
如果不考虑非PC设备和机器效率等问题,java平台几乎是最佳解决方案。
但是缺点也很明显,如果想把核心算法和功能应用到非PC设备(例如嵌入式手持设备),则要求设备上有支持前面提及的加密类库的CVM;对于在PC上运行,JVM的数据运算速度要远远落后于本地化代码在PC上的运算速度,本软件需要进行大量运算,这一点不适合由java完成。
(2.) 整个工程使用.Net平台实现
与使用java平台完全类似,加密等有.Net基础类库的支持,不需要大量编码实现,另外由于VisualStudio的强大便利,这种规模的工程可以十分迅速的完成。
缺点是只能在有微软.NetFramework的环境运行,在Windows操作系统,.NetFramework的机器效率好于java平台,但是相比于本地化的代码,还是十分拖沓的。
(3.)整个工程使用Windows本地化程序实现
在不应用Windows或第三方现成组件的情况下,需从RSA算法出发编码实现。
其他各功能的设计开发,如文件操作、数据编码转换和图形界面等,可以使用ATL、MFC或WindowsAPI实现。
这种工程几乎是为Windows量身订做,执行效率最好。
但是对于非PC设备,只能方便的移植到运行Windows嵌入式操作系统的设备,向其他操作系统移植困难,需要重新编写大量代码。
通常解决本地化代码的移植问题,都是使用C++标准库,即功能尽量多的由C++标准库完成,这样在移植的时候,只需要重新编写操作系统相关的代码即可。
这种开发方式比起前两种,缺点就是设计开发模式陈旧,代码烦琐,不方便维护;流行的.Net上的语言引用各种功能比较麻烦。
(4.) 考虑可能的复用,针对具体情况分层开发实现
综合考虑复用性、可维护性和执行效率,较妥当的方法是分层设计。
核心的RSA算法由C++类库实现,针对用户所在的操作系统封装成本地化组件。
其他各功能如文件操作、数据编码转换和图形界面等,由托管代码借助虚拟机平台标准库的功能快速开发实现(本文针对选用.Net上的C#论述,选用java由JNI或其他方式调用本地组件,设计模式上是完全类似的)。
这种开发方式,核心功能集中在最底层,在不断的封装中针对具体环境对组件功能不断扩充,任意一个层面的封装都可以被直接应用到其他项目,比如在Web使用以前为某窗体程序写的组件、给嵌入式设备交叉编译算法库等。
但是每一层都需要依赖底层的所有组件。
图2-2形象的说明了分层设计给复用带来的好处。
选用第四种设计方案,上层使用C#,底层算法使用C++,可以由一个VisualStudio解决方案管理,给调试带来极大的方便。
整个工程分四层,实现RSA加密算法的C++核心类库、封装C++核心类库的DLL组件、引用DLL的.Net类、实现文件操作功能的.Net窗体应用程序。
2.2节详细介绍各部分的设计与开发。
考虑到工作量,本软件加解密数据没有严格遵从RSA标准PKCS#1,而是在满足设计要求的前提下,以一种尽可能简单的方式实现加密和解密。
2.2各部分的设计与开发
2.2.1实现RSA加密算法的C#核心类库
(1.)大数存储和四则运算
根据RSA算法的要求,为了实现大数的各种复杂运算,需要首先实现大数存储和基本四则运算的功能。
当今开源的大数运算C++类有很多,多用于数学分析、天文计算等,本文选用了一个流行的大数类型,并针对RSA算法和本项目的具体需要对其进行了扩充和改进。
下面简单介绍大数存储和四则运算的实现原理。
最先完成的功能是大数的存储,存储功能由flex_unit类提供。
和普通的类型一样,每一个大数对应一个flex_unit的实例。
类flex_unit中,用一个无符号整数指针unsigned*a指向一块内存空间的首地址,这块内存空间用来存储一个大数,所以可以说,大数是被存储在一个以unsigned为单元的线性组中。
在方法voidreserve(unsignedx)中通过C++的new来给a开辟空间,当flex_unit的实例中被存入比当前存储的数更大的数时,就会调用reserve来增加存储空间,但是当flex_unit的实例中被存入比当前存储的数更小的数时,存储空间并不会自动紧缩,这是为了在运算的时候提高执行效率。
结合指针a,有两个重要的无符号整数来控制存储,unsignedz和unsignedn,z是被分配空间的单元数,随数字变大不断增大,不会自己紧缩,而n是当前存储的大数所占的单元数,组成一个大数的各unsigned单元的存入和读出由set、get方法完成,变量n是只读的。
类型unsigned在32位机是32位的,所以对于flex_unit这个大数类来说,每个大数最大可以达到个字节长,这已经超过了32位机通常的最大内存容量,所以是足够进行RSA所需要的各种运算的。
图2-3形象的说明了大数存储类flex_unit对大数的管理。
(2.)寻找素数•Eratosthenes筛选与Fermat素数测试
首先要说明的是,事实上,当今的计算机还不足以聪明到立刻计算生成一个很大的随机素数。
一般来说,要得到100%准确的大素数,都是通过查已经计算好的素数表的方式。
但是素数表的方式给RSA的安全性带来隐患,因为攻击者如果得到了密钥生成时所使用的素数表,攻破RSA加密的难度将会大大降低。
本程序起初使用素数表的方式,后来考虑到安全性问题,生成密钥的方式改为随机计算生成。
这样,短时间内如果要得到一个100%准确的大素数是很困难的,只能以尽可能高的概率得到一个大素数。
经过2.2.1.1和2.2.1.2小节,所有的大数运算功能都准备完毕,在此基础上,本工程将寻找素数的功能置于类Prime_factory_san之中。
外部只要调用本类实例的成员vlongfind_prime(vlong&start)就可以以大数start为起点,得到一个数,这个数是素数的概率很大。
下面介绍寻找素数的原理。
首先在需要寻找素数的整数范围内对整数进行筛选,把所有确知为合数的整数排除出去。
程序中构造了一个数组b[],大小为一轮素数搜索的范围,记搜索范围大小为SS。
b[0]到b[SS]分别对应大数start到start+SS。
b[]中所有元素先初始化为1,如果对应的大数确定为合数,就将b[]中对应的元素置为0。
最后,只需对那些b[]中为1的元素对应的大数进行比较确切的素数测试即可,只要被测试的数是素数概率达到一定门限,就判这个数为素数。
这样做既保证了这段程序可以在短时间内执行完,又保证了可以以比较高的准确度得到素数。
函数find_prime先把b[]的所有元素赋值为1,然后按参数start给标记数组b[]的各元素赋0值。
下面描述标记数组b[]的赋0值算法。
首先,在类Prime_factory_san被构造的时候,构造函数中从2开始搜寻一些小素数,记录在数组pl[]中,共记录NP个。
这些小素数用来当作因子,他们的倍数将被从大素数搜索范围内剔除(即把数组b[]的对应元素标记为0),剔除的程序代码如下。
for(i=0;i { unsignedp=pl[i]; unsignedr=start%vlong(p); if(r)r=p-r; while(r { b[r]=0; r+=p; } } 这里利用start对各小素数因子p求模的办法,得到当前p在素数搜索范围内的最小倍数在b[]中的对应位置,将其剔除后,不断后移p个位置,将这个小素数因子p在搜索范围内的所有倍数全部剔除,如图2-5所示。 在完成对所有小素数因子的类似操作后,他们的倍数在搜索范围内的位置标记b[r]被全部标记为0。 实际上这就是Eratosthenes筛选法。 数轴 素数搜索范围start到start+SS 小素数因子p 搜索起点start对应b[0] 距离start: p-(startmodp) b[x] b[x+p] b[x+2p] b[x+3p] b[x+4p] b[x+5p] : 剔除。 b中对应元素标记为0 设在刚执行到while时r>0x=r 图2-5在素数搜索范围内剔除小素数因子p的倍数 接下来,对可能为素数的数(即标记数组b[]中值为1的元素对应的数)进行素数测试。 数论学家利用费马小定理研究出了多种素数测试方法,本程序使用一种最简单的方式,直接应用费马小定理。 取一个与p互素的整数A,对于大素数p来说应该满足Ap-1modp=1,但是我们把p代入一个大整数,满足这个关系的数不一定是素数。 这时我们改变A,进行多次测试,如果多次测试都通过,这个数是素数的概率就比较大。 按这种原理,我们编写素数测试函数如下。 intis_probable_prime_san(constvlong&p) { constrep=4;//测试次数 constunsignedany[rep]={2,3,5,7};//测试用的底数 for(unsignedi=0;i if(modexp(any[i],p-vlong (1),p)! =vlong (1))return0; //modexp是幂模函数,按上一小节叙述的算法编码。 //这里modexp计算any[i]p-1modp。 return1; } 测试通过,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 信息 安全 课程设计 报告