RSA算法课程设计报告.doc

上传人:wj 文档编号:1215801 上传时间:2023-04-30 格式:DOC 页数:20 大小:136.50KB
下载 相关 举报
RSA算法课程设计报告.doc_第1页
第1页 / 共20页
RSA算法课程设计报告.doc_第2页
第2页 / 共20页
RSA算法课程设计报告.doc_第3页
第3页 / 共20页
RSA算法课程设计报告.doc_第4页
第4页 / 共20页
RSA算法课程设计报告.doc_第5页
第5页 / 共20页
RSA算法课程设计报告.doc_第6页
第6页 / 共20页
RSA算法课程设计报告.doc_第7页
第7页 / 共20页
RSA算法课程设计报告.doc_第8页
第8页 / 共20页
RSA算法课程设计报告.doc_第9页
第9页 / 共20页
RSA算法课程设计报告.doc_第10页
第10页 / 共20页
RSA算法课程设计报告.doc_第11页
第11页 / 共20页
RSA算法课程设计报告.doc_第12页
第12页 / 共20页
RSA算法课程设计报告.doc_第13页
第13页 / 共20页
RSA算法课程设计报告.doc_第14页
第14页 / 共20页
RSA算法课程设计报告.doc_第15页
第15页 / 共20页
RSA算法课程设计报告.doc_第16页
第16页 / 共20页
RSA算法课程设计报告.doc_第17页
第17页 / 共20页
RSA算法课程设计报告.doc_第18页
第18页 / 共20页
RSA算法课程设计报告.doc_第19页
第19页 / 共20页
RSA算法课程设计报告.doc_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

RSA算法课程设计报告.doc

《RSA算法课程设计报告.doc》由会员分享,可在线阅读,更多相关《RSA算法课程设计报告.doc(20页珍藏版)》请在冰点文库上搜索。

RSA算法课程设计报告.doc

摘要:

RSA算法是基于数论的公钥密码体制,是公钥密码体制中最优秀的加密算法,同时也是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。

本文主要研究的内容包括:

第一,对RSA算法进行了全面系统的介绍,包括RSA算法的应用现状和原理—大素数的产生、密钥对的产生、对明文的加密运算和密文的解密运算,为具体实现打下了理论基础;第二,介绍了RSA机密体制的一些基本概念及原理;第三,详述了RSA加密的设计与实现,主要实现的模块包括RSA密钥的产生(一对公钥和私钥),RSA加密算法和解密算法的实现;第五,对该系统进行了整体的测试和分析改进;

关键词:

RSA算法;公钥密码体制;加密;解密;VC++

目 录

1课题综述 1

1.1课题来源 1

1.2课题意义 1

1.3预期目标 1

2系统分析 1

2.1基础知识 2

2.2总体方案 4

2.3功能模块 4

3系统设计 5

3.1算法描述 5

3.2流程图 7

4代码编写 9

5运行与测试 14

5.1产生公钥和密钥 14

5.2加密与解密 14

总结 16

致谢 17

参考文献 18

《现代密码学课程设计报告》

1课题综述

1.1课题来源

随着电子信息技术的迅速发展,人类已步入信息社会。

但是由于整个社会形成了一个巨大的计算机网络,任何一个计算机网络出现的安全问题,都会影响整个国家的网络安全,所以信息安全、计算机网络安全问题已引起了人类的高度重视。

无论是在局域网还是在广域网中,都存在着自然和人为等诸多因素的脆弱性和潜在威胁。

故此,网络的安全措施应是能全方位地针对各种不同的威胁和脆弱性,这样才能确保网络信息的保密性、完整性和可用性。

现代密码学已成为信息安全技术的核心,密码学是以研究通信安全保密的学科,即研究对传输信息采用何种秘密的变换以防止第三者对信息的窃取。

公钥密码体制的特点是:

接收方B产生一对密钥(PK和SK);PK公开,SK保密;从PK推出SK是很困难的;A、B双方通信时,A通过任何途径取得B的公钥,用B的公钥加密信息,加密后的信息可通过任何不安全信道发送。

B收到密文信息后,用自己私钥解密恢复出明文。

公钥密码体制已成为确保信息的安全性的关键技术。

RSA公钥密码体制到目前为止还是一种被认可为安全的体制。

1.2课题意义

RSA公钥加密算法是第一个既能用于数据加密也能用于数字签名的算法。

它易于理解和操作,也十分流行。

算法的名字以发明者的姓氏首字母命名:

RonRivest,AdiShamir和LeonardAdleman。

虽然自1978年提出以来,RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击,至今未被完全攻破。

随着越来越多的商业应用和标准化工作,RSA已经成为最具代表性的公钥加密技术。

VISA、MasterCard、IBM、Microsoft等公司协力制定的安全电子交易标准(SecureElectronicTransactions,SET)就采用了标准RSA算法,这使得RSA在我们的生活中几乎无处不在。

网上交易加密连接、网上银行身份验证、各种信用卡使用的数字证书、智能移动电话和存储卡的验证功能芯片等,大多数使用RSA技术。

应用了RSA加密体制保证了秘密信息的安全。

1.3预期目标

在充分理解RSA加密体制概念和原理的基础上,用MicrosoftVisualC++6.0实现RSA加密与解密,演示公钥与密钥的生成及加密与解密的过程。

2系统分析

2.1基础知识

2.1.1素数

称整数p(p>1)是素数,如果p的因子只有±1,±p。

称c是两个整数a、b的最大公因子,如果

①c是a的因子也是b的因子,即c是a、b的公因子。

②a和b的任一公因子,也是c的因子。

表示为c=gcd(a,b)。

由于要求最大公因子为正,所以gcd(a,b)=gcd(a,-b)=gcd(-a,b)=gcd(-a,-b)。

一般gcd(a,b)=gcd(|a|,|b|)。

由任一非0整数能整除0,可得gcd(a,0)=|a|。

如果将a,b都表示为素数的乘积,则gcd(a,b)极易确定。

一般由c=gcd(a,b)可得:

对每一素数p,cp=min(ap,bp)。

由于确定大数的素因子不很容易,所以这种方法不能直接用于求两个大数的最大公因子,如何求两个大数的最大公因子在下面介绍。

如果gcd(a,b)=1,则称a和b互素。

2.1.2模运算

设n是一正整数,a是整数,如果用n除a,得商为q,余数为r,则

a=qn+r,0≤r

其中x为小于或等于x的最大整数。

用amodn表示余数r

如果(amodn)=(bmodn),则称两整数a和b模n同余,记为a≡bmodn。

称与a模n同余的数的全体为a的同余类,记为[a],称a为这个同余类的表示元素。

2.2.3欧拉函数和欧拉定理

欧拉函数:

设n是一正整数,小于n且与n互素的正整数的个数称为n的欧拉函数,记为φ(n)。

若n是素数,则显然有φ(n)=n-1。

若n是两个素数p和q的乘积,则φ(n)=φ(p)×φ(q)=(p-1)×(q-1)。

欧拉定理:

若a和n互素,则aφ(n)≡1modn。

2.1.4欧几里德算法

欧几里得(Euclid)算法是数论中的一个基本技术,是求两个正整数的最大公因子的简化过程。

而推广的Euclid算法不仅可求两个正整数的最大公因子,而且当两个正整数互素时,还可求出其中一个数关于另一个数的乘法逆元。

1.求最大公因子:

Euclid算法是基于下面一个基本结论:

对任意非负整数a和正整数b,有gcd(a,b)=gcd(b,amodb)。

2.求乘法逆元:

如果gcd(a,b)=1,则b在moda下有乘法逆元(不妨设b

2.1.5RSA算法中的计算问题

1.RSA的加密与解密过程

RSA的加密、解密过程都为求一个整数的整数次幂,再取模。

如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。

如上例中解密运算6677mod119,先求6677再取模,则中间结果就已远远超出了计算机允许的整数取值范围。

而用模运算的性质:

(a×b)modn=[(amodn)×(bmodn)]modn

就可减小中间结果再者,考虑如何提高加、解密运算中指数运算的有效性。

例如求x16,直接计算的话需做15次乘法。

然而如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。

2.RSA密钥的产生

产生密钥时,需要考虑两个大素数p、q的选取,以及e的选取和d的计算。

因为n=pq在体制中是公开的,因此为了防止敌手通过穷搜索发现p、q,这两个素数应是在一个足够大的整数集合中选取的大数。

如果选取p和q为10100左右的大素数,那么n的阶为10200,每个明文分组可以含有664位(10200≈2664),即83个8比特字节,这比DES的数据分组(8个8比特字节)大得多,这时就能看出RSA算法的优越性了。

因此如何有效地寻找大素数是第一个需要解决的问题。

寻找大素数时一般是先随机选取一个大的奇数(例如用伪随机数产生器),然后用素性检验算法检验这一奇数是否为素数,如果不是则选取另一大奇数,重复这一过程,直到找到素数为止。

素性检验算法通常都是概率性的,但如果算法被多次重复执行,每次执行时输入不同的参数,算法的检验结果都认为被检验的数是素数,那么就可以比较有把握地认为被检验的数是素数。

2.1.6公钥密码体制的基本概念

在公钥密码体制以前的整个密码学史中,所有的密码算法,包括原始手工计算的、由机械设备实现的以及由计算机实现的,都是基于代换和置换这两个基本工具。

而公钥密码体制则为密码学的发展提供了新的理论和技术基础,一方面公钥密码算法的基本工具不再是代换和置换,而是数学函数;另一方面公钥密码算法是以非对称的形式使用两个密钥,两个密钥的使用对保密性、密钥分配、认证等都有着深刻的意义。

可以说公钥密码体制的出现在密码学史上是一个最大的而且是惟一真正的革命。

公钥密码体制的概念是在解决单钥密码体制中最难解决的两个问题时提出的,这两个问题是密钥分配和数字签字。

单钥密码体制在进行密钥分配时(看第5章),要求通信双方或者已经有一个共享的密钥,或者可籍助于一个密钥分配中心。

对第一个要求,常常可用人工方式传送双方最初共享的密钥,这种方法成本很高,而且还完全依赖信使的可靠性。

第二个要求则完全依赖于密钥分配中心的可靠性。

第二个问题数字签字考虑的是如何为数字化的消息或文件提供一种类似于为书面文件手书签字的方法。

1976年W.Diffie和M.Hellman对解决上述两个问题有了突破,从而提出了公钥密码体制。

2.2总体方案

要实现生成公钥和密钥的功能,必须先生成两个大素数。

方法是先设定随机种子为系统当前时间,然后随即生成两个100以内的随机数,并判断其是否为素数,取出这两个素数。

然后通过调用函数生成公钥对和密钥对,同时显示出结果到屏幕上。

随后可以用公钥对明文进行加密,将加密后的秘闻显示出来。

然后可以演示用密钥对密文进行解密,并将结果显示到屏幕上。

2.3功能模块

本系统含有两个功能模块:

(1)公钥和密钥生成模块:

可以生成个100以内的素数p和q,以及n、e、d;

(2)加密和解密模块:

可以显示加密后的数据,点击解密可显示解密后数据。

系统功能界面图如下:

图2-1系统功能界面图

3系统设计

3.1算法描述

RSA算法描述:

(1)密钥的产生

①选两个保密的大素数p和q。

②计算n=p×q,φ(n)=(p-1)(q-1),其中φ(n)是n的欧拉函数值。

③选一整数e,满足1

④计算d,满足d·e≡1modφ(n),即d是e在模φ(n)下的乘法逆元,因e与φ(n)互素,由模运算可知,它的乘法逆元一定存在。

⑤以{e,n}为公开钥,{d,n}为秘密钥。

(2)加密

加密时首先将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于log2n。

然后对每个明文分组m,作加密运算:

c≡memodn

(3)解密

对密文分组的解密运算为:

m≡cdmodn

下面证明RSA算法中解密过程的正确性。

证明:

由加密过程知c≡memodn,所以

cdmodn≡medmodn≡m1modφ(n)modn≡mkφ(n)+1modn

要获得两个随机的小于100的素数,可以首先将系统当前时间设置为随机数种子,然后对生成的随机数取100模,然后调用判断素数的函数。

要判断一个属实否为素数,可以判断数n从2到n的开方,是否能整除n。

伪代码如下:

for(i从2到n的开方;i++)

{

if(n被i整除)

则n不是素数终止循环;

if(i>n的开方)

返回n为宿舍;

}

求最大公因子的算法:

Euclid算法就是用这种方法,因gcd(a,b)=gcd(|a|,|b|),因此可假定算法的输入是两个正整数,设为d,f,并设f>d。

Euclid(f,d)

①X←f;Y←d;

②ifY=0thenreturnX=gcd(f,d);

③R=XmodY;

④X=Y;

⑤Y=R;

⑥goto②。

求乘法逆元:

推广的Euclid算法先求出gcd(a,b),当gcd(a,b)=1时,则返回b的逆元。

ExtendedEuclid(f,d)(设f>d)

①(X1,X2,X3)←(1,0,f);(Y1,Y2,Y3)←(0,1,d);

②ifY3=0thenreturnX3=gcd(f,d);noinverse;

③ifY3=1thenreturnY3=gcd(f,d);Y2=d-1modf;

④Q=X3Y3;

⑤(T1,T2,T3)←(X1-QY1,X2-QY2,X3-QY3);

⑥(X1,X2,X3)←(Y1,Y2,Y3);

⑦(Y1,Y2,Y3)←(T1,T2,T3);

⑧goto②。

处理明文:

将明文的每个字符提取出来将其装换为数字。

进行加密处理,将处理后的数字字符用“+”号相连。

其中加密的算法为:

求am可如下进行,其中a,m是正整数:

将m表示为二进制形式bkbk-1…b0,即

m=bk2k+bk-12k-1+…+b12+b0

因此:

例如:

19=1×24+0×23+0×22+1×21+1×20,所以

a19=((((a1)2a0)2a0)2a1)2a1

从而可得以下快速指数算法:

c=0;d=1;

Fori=kdownto0d0{

c=2×c;

d=(d×d)modn;

ifbi=1then {

c=c+1;

d=(d×a)modn

}

}

returnd.

其中d是中间结果,d的终值即为所求结果。

c在这里的作用是表示指数的部分结果,其终值即为指数m,c对计算结果无任何贡献,算法中完全可将之去掉。

解密过程:

将“+”连接的数字字符转换为数字并相加,用密钥做与加密相同的算法,即可得出明文。

3.2流程图

开始

产生素数p和q

p,q<100且为素数

N=(p-1)*(q-1)

找出e

e为素数与n互素

求出d

结束

图3-1生成公钥和私钥流程图开始

明文不为空

将明文转换为数字加密

结束

取得明文

图3-2明文加密流程图

开始

密文不为空

将密文转换为明文

结束

取得密文

图3-3密文解密流程图

4代码编写

在RSADlg.h中声明成员变量:

int m_p;

int m_q;

int m_n;

int m_code;

int m_decode;

CString m_dtxt;

CString m_etxt;

CString m_ptxt;

1.产生公钥和密钥:

voidCRSADlg:

:

OnButtonProduce()//产生公钥和密钥函数

{

UpdateData(true);

while(true)

{

srand(time(0));

m_p=rand()%100;

m_q=rand()%100;

if(isPrime(m_p)&&isPrime(m_q))

break;

}

m_n=m_p*m_q;

intfiN=(m_p-1)*(m_q-1);

//inte;

for(inti=3;i

{

if(isPrime(i)&&gcd(fiN,i)==1)

{

m_code=i;

break;

}

}

Euler(m_code,fiN);

UpdateData(false);

}

代码分析:

首先设置系统的当前时间为随机种子,循环找出p和q并且调用判断素数的函数isPrime(int)使p,q都为小于100的素数,然后fiN=(m_p-1)*(m_q-1)产生fiN,产生m_n=m_p*m_q,通过调用gcd(fiN,i)找出与fiN互素的数m_code,调用uler(m_code,fiN)找出m_decode,最后UpdateData(false)刷新文本框显示出结果。

2.加密明文:

voidCRSADlg:

:

OnCode()//加密函数

{

CStringtemp;

UpdateData(true);

CStringencSt="";

CStringe2st="";

if(m_ptxt.IsEmpty())

return;

for(inti=0;i

{

temp=encSt;

encSt.Format("%s%d%s",temp,power((int)m_ptxt.GetAt(i),m_code,m_n),"+");

}

m_etxt=encSt;

UpdateData(false);

}

代码分析:

首先判断明文文本框是否为空,若为空则返回。

取出明文的每个字符,将其装换为数字,通过加密函数power转换后,生成的数字字符用“+”号相连,即为密文。

调用UpdateData(false)刷新文本框,显示加密后的结果。

3.解密密文

voidCRSADlg:

:

OnDecode()//解密函数

{

intptr;

inttok;

CStringtemp="";

UpdateData(true);

CStringDecSt="";

//intt=m_etxt.GetLength();

for(inti=0;i

{

ptr=m_etxt.Find("+",i);

tok=atoi(m_etxt.Mid(i,ptr-i));

temp=DecSt;

DecSt.Format("%s%c",temp,char(power(tok,m_decode,m_n)));

i=i+num(tok)+1;

}

m_dtxt=DecSt;

UpdateData(false);

}

代码分析:

计算出密文字符串的长度,循环寻找以字符“+”分隔得数字字符串,并将其转换问数字,然后调用power函数处理,将得出的数字转换为字符,将得出的字符连接起来就解密出了明文,最后调用UpdateData(false)刷新文本框,显示出解密出的结果。

4.其他函数:

intCRSADlg:

:

power(inta,intn,intm)//求出a的n次方模m的值

{

intz=1,t;

for(t=a;n>0;n>>=1)

{

if(n%2==1)z=(z*t)%m;

t=(t*t)%m;

}

return(z);

}

BOOLCRSADlg:

:

isPrime(intx)//判断整数i是否为素数

{

inti;

for(i=2;i<=(int)sqrt(x);i++)

{

if(x%i==0)

break;

}

if(i>(int)sqrt(x))

returntrue;

returnfalse;

}

intCRSADlg:

:

gcd(inta,intb)//求出a与b的公因子

{

if(a==0)

{

returnb;

}

else

{

returngcd(b%a,a);

}

}

voidCRSADlg:

:

Euler(inte,intfin)//求出e相对模fin的乘法逆元

{

intu1=1;

intu2=0;

intu3=fin;

intv1=0;

intv2=1;

intv3=e;

intv=1;

intt1,t2,t3;

intq;

intuu,vv;

intinverse,z;

while(v3!

=0)

{

q=(int)(u3/v3);

t1=u1-q*v1;

t2=u2-q*v2;

t3=u3-q*v3;

u1=v1;

u2=v2;

u3=v3;

v1=t1;

v2=t2;

v3=t3;

z=1;

}

uu=u1;

vv=u2;

if(vv<0)

inverse=vv+fin;

else

inverse=vv;

m_decode=inverse;

}

5运行与测试

5.1产生公钥和密钥

点击密钥生成,运行效果如下图:

图5-1产生公钥和密钥效果图

5.2加密与解密

1.点击加密,运行效果如下图:

图5-2加密效果图

2.点击解密,运行效果如下图:

图5-3解密效果图

总结

通过这次课程设计,我对RSA加密体制有了更进一步的了解。

遇到的主要问题是如何将明文按照比特分组并对其实现RSA加密,以及对大素数的处理。

最终大素数的处理得以实现,但明文分组并没有找到合适的方法,这就要求我在课程设计后去学习怎样为明文分组机密。

要想学好现代密码学不仅要学习好密码学相关知识,还要有很好的数学基础,还有很强的编程能力,这个课程设计是用MicrosoftVisualC++6.0的开发环境写的,这对编程要求很高,不仅要会密码学中RSA的加密机制,算法还要熟知VC++的编程方法,要对微软的MFC的基本编程方法要熟悉。

课程设计时对学生个人综合能力的检验。

任何知识和技术都不是孤立的。

要学习好密码学要牵扯到线性代数,离散数学,概率统计等数学知识,为了验证加密解密算法的正确性,还要动手编制程序,这就要求学生要对至少一种编程技术有所熟知。

对RSA加密体制还可以运用到手机等终端设备的加密,也可嵌入到其他小型化的设备中去,下一步我们讲进一步对这些方向进行研究。

致谢

感谢老师给了这次机会给我们做这次课程设计,让我们能够把平时所学的东西用上,不至于让我们觉得平时学的东西没什么用,在这短短的时间里完成了本次课程设计,要感谢朋友们的帮忙,在我困惑的时候要不是你们,我可能早就放弃了,因为你们的帮忙,我才能顺利的完成这次系统。

其实最辛苦的还是老师,请允许我向你们说声谢谢,感谢你们对我们的教诲。

在这次课程设计的过程中,我觉得我真的是获得了很多的东西,不仅仅是动手能力及编程能力得到了很大的提高,也不仅仅是在修改程序错误方面,主要是在程序编写过程中获得了大量的宝贵的经验。

此外,在这次实践过程中发现数据库是一门十分实用的课程,也体会到学好数据库对我们以后的学习,工作是十分重要的。

因而在此,我要感谢那些在实践过程中给过我帮助和鼓励的人。

最后对所有在课程设计中帮助过我的老师和同学说一声谢谢。

参考文献

1杨波.现代密码学.第2

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

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2