RSA毕业设计论文.docx

上传人:b****5 文档编号:7660131 上传时间:2023-01-25 格式:DOCX 页数:27 大小:161.62KB
下载 相关 举报
RSA毕业设计论文.docx_第1页
第1页 / 共27页
RSA毕业设计论文.docx_第2页
第2页 / 共27页
RSA毕业设计论文.docx_第3页
第3页 / 共27页
RSA毕业设计论文.docx_第4页
第4页 / 共27页
RSA毕业设计论文.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

RSA毕业设计论文.docx

《RSA毕业设计论文.docx》由会员分享,可在线阅读,更多相关《RSA毕业设计论文.docx(27页珍藏版)》请在冰豆网上搜索。

RSA毕业设计论文.docx

RSA毕业设计论文

(此文档为word格式,下载后您可任意编辑修改!

ResearchAndDevelopmentOf

RSAFileEncryption

摘要

关键词RSARSA算法文件加密加密成文本

Abstract

KeywordsRSARSAalgorithmfileencryptionencrypttotext

前言1

第1章RSA应用现状及应用于文件加密的分析2

1.1RSA算法介绍与应用现状2

1.2RSA应用于文件加密的分析3

1.2.1文件加密使用RSA的可行性3

1.2.2文件加密使用RSA的意义4

第2章RSA文件加密软件的设计与实现6

2.1需求分析与总体设计6

2.1.1功能分析6

2.1.2工程方案选择7

2.2各部分的设计与开发8

2.2.1实现RSA加密算法的C++核心类库8

2.2.2封装C++核心类库的DLL组件18

第3章软件整体测试与分析改进20

3.1编写测试各项性能需要的精确计时类20

3.2测试数据与分析改进20

3.2.1密钥生成测试20

3.2.2数据输入输出测试23

3.2.3加密解密测试23

3.2.4性能分析与改进优化26

3.3使用中国余数定理27

第4章可移植模块的简要说明与开发前景29

结束语30

谢辞31

参考文献32

附录33

前言

当今公钥加密更广泛应用于互联网身份认证,本课题将公钥加密算法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算法协议见SSL(SSL,SecuritySocketLayer,是一个安全传输协议,在Internet上进行数据保护和身份确认。

OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的EricYang等发起编写的。

相关详细介绍见)。

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算法应用规范介绍参见:

),调试一个函数测试,按初等数论中的知识对程序进行算法优化,最终在一台配置为AMDAthron2800+,外频333MHZ,物理内存512MB的PC上测试需要约45毫秒时间。

如果按这种速度,逐字节对1KB的数据进行同样的运算,所消耗的时间理论上为45毫秒的1024倍即约45秒。

这个时间并不是非常长。

其实从一个简单的角度来说,既然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与特定的某人交流重要保密信息的情况,加密生成的数据应该是文本,这样可以方便复制粘贴。

第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完成。

3.整个工程使用Windows本地化程序实现

4.考虑可能的复用,针对具体情况分层开发实现

图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-3flex_unit对大数的管理

在flex_unit的存储功能基础上,将其派生,得到vlong_value,在vlong_value中实现四则运算函数,并实现强制转换运算符unsigned,以方便大数类型和普通整数的互相赋值。

当大数被强制转换为unsigned时,将取其最低四字节的值。

四则运算实现的原理十分简单,都是按最基本的算术原理实现的,四则运算过程的本质就是按一定数制对数字的计算,比如相加,就是低位单元对齐,逐单元相加并进位,减法同理。

而乘除法和取余也都是按照竖式运算的原理实现,并进行了必要的优化。

虽然实现了四则运算函数,但是若是程序里的运算都要调用函数,显得烦琐而且看起来不美观,所以我们另写一个类vlong,关联(Associate,即使用vlong_value类型的对象或其指针作为成员)vlong_value,在vlong重载运算符。

这样,当我们操作vlong大数对象的时候,就可以像使用一个简单类型一样使用各种运算符号了。

之所以将vlong_value的指针作为成员而不是直接构造的对象,也是为了提高执行效率,因为大型对象的拷贝要消耗不少机器时间。

2.大数幂模与乘模运算•Montgomery幂模算法

在实现了vlong类型后,大数的存储和四则运算的功能都完成了。

考虑到RSA算法需要进行幂模运算,需要准备实现这些运算的方法。

所以写一个vlong的友元,完成幂模运算功能。

幂模运算是RSA算法中比重最大的计算,最直接地决定了RSA算法的性能,针对快速幂模运算这一课题,西方现代数学家提出了很多的解决方案。

经查阅相关数学著作,发现通常都是依据乘模的性质

,先将幂模运算化简为乘模运算。

通常的分解习惯是指数不断的对半分,如果指数是奇数,就先减去一变成偶数,然后再对半分,例如求D=,E=15,可分解为如下6个乘模运算。

归纳分析以上方法,对于任意指数E,可采用如图2-4的算法流程计算。

图2-4幂模运算分解为乘模运算的一种流程

按照上述流程,列举两个简单的幂模运算实例来形象的说明这种方法。

①求的值

开始D=1P=2mod17=2E=15

E奇数D=DPmodn=2P=PPmodn=4E=(E-1)2=7

E奇数D=DPmodn=8P=PPmodn=16E=(E-1)2=3

E奇数D=DPmodn=9P=PPmodn=1E=(E-1)2=1

E奇数D=DPmodn=9P=PPmodn=1E=(E-1)2=0

最终D=9即为所求。

②求的值

开始D=1P=2mod17=2E=8

E偶数D=1P=PPmodn=4E=E2=4

E偶数D=1P=PPmodn=3E=E2=2

E偶数D=1P=PPmodn=9E=E2=1

E奇数D=DPmodn=9P=不需要计算E=(E-1)2=0

最终D=9即为所求。

观察上述算法,发现E根据奇偶除以二或减一除以二实际就是二进制的移位操作,所以要知道需要如何乘模变量,并不需要反复对E进行除以二或减一除以二的操作,只需要验证E的二进制各位是0还是1就可以了。

同样是计算,下面给出从右到左扫描二进制位进行的幂模算法描述,设中间变量D,P,E的二进制各位下标从左到右为u,u-1,u-2,…,0。

Powmod(C,E,n)

{

D=1;

P=Cmodn;

fori=0toudo

{

if(Ei=1)D=D*P(modn);

  P=P*P(modn);

  }

  returnD;

}

有些文献将上述算法称为平方乘积二进制快速算法,例如参考文献中的《基于RSA算法的一种新的加密核设计》,其实这种算法本质上和图2-4的流程完全一致,只是把根据指数奇偶分开的减一和除以二合并成对指数二进制各位的判断而已。

在本软件的代码中采用直接扫描vlong二进制各位的办法。

剩下的问题就是乘模运算了。

提高乘模运算的速度是提高模幂运算速度的关键。

一般情况下,n是数百位乃至千位以上的二进制整数,用普通的除法求模而进行乘模运算是不能满足速度的要求的。

为此,Montgomery在1983年提出了一种模加右移的乘模算法(主要著作发表于1985年),从而避免了通常求模算法中费时的除法步骤。

本软件仅仅是应用Montgomery(蒙哥马利)算法,算法的具体推导证明需要颇多数论知识,不在本文的讨论范围内,如需了解可参见蒙哥马利的相关著作。

下面简单描述RSA中常用的Montgomery(蒙哥马利)算法供参考理解源程序。

选择与模数n互素的基数R=2k,n满足2k-1≤n<2k,n应为奇数。

并且选择R-1及n’,满足0

对于0≤m

M(m)

{

if(t≥n)return(t-n);

elsereturnt;

}

因为,故t为整数;同时,得。

由于,M(m)中t结果范围是0≤t<2n,返回时如果t不小于n,应返回t-n。

本软件程序中,RSA核心运算使用的乘模算法就是M(A*B)。

虽然M(A*B)并不是乘模所需要的真正结果,但只要在幂模算法中进行相应的修改,就可以调用这个乘模算法进行计算了。

本软件起初未使用Montgomery乘模算法时,加密速度比使用Montgomery乘模算法慢,但速度相差不到一个数量级。

将上述乘模算法结合前面叙述的幂模算法,构成标准Montgomery幂模算法,即本软件所使用的流程,叙述如下。

M(m)

{

k=(m*n’)modR;

x=(m+k*n)R;

if(x>=n)x-=n;

returnx;

}

exp(C,E,n)

{

      D=R-n;

      P=C*Rmodn;

i=0;

      while(true)

         {

             if(E的当前二进制位Ei==1)D=M(D*P);从低位到高位检测二进制位

i+=1;

if(i==E的二进制位数)break;

           P=M(P*P);

        }

  returnD*R-1(modn);

}

在具体的实现中,对应monty类的mul和exp方法。

全局函数modexp初始化monty对象并调用其exp方法,使用的时候直接调用modexp即可。

3.寻找素数•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筛选法。

图2-5在素数搜索范围内剔除小素数因子p的倍数

接下来,对可能为素数的数(即标记数组b[]中值为1的元素对应的数)进行素数测试。

数论学家利用费马小定理研究出了多种素数测试方法,本程序使用一种最简单的方式,直接应用费马小定理。

取一个与p互素的整数A,对于大素数p来说应该满足Ap-1modp=1,但是我们把p代入一个大整数,满足这个关系的数不一定是素数。

这时我们改变A,进行多次测试,如果多次测试都通过,这个数是素数的概率就比较大。

按这种原理,我们编写素数测试函数如下。

intis_probable_prime_san(constvl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1