RSA算法实验报告

合集下载

RSA实验报告

RSA实验报告

RSA算法的C语言实现一、RSA 算法的描述1、选取长度相等的两个大素数p 和q,计算其乘积:n = pq,然后随机选取加密密钥e,使e 和(p–1)(q–1)互素。

最后用欧几里德扩展算法计算解密密钥d,以满足ed = 1(mod(p–1) ( q–1))即d = e–1 mod((p–1)(q–1)),e 和n 是公钥,d 是私钥。

2、加密公式如下:ci = mi^e(mod n)3、解密时,取每一密文分组ci 并计算:mi = ci^d(mod n)Ci^d =(mi^e)^d= mi^(ed)= mi^[k(p–1)(q–1)+1 ]= mi mi^[k(p–1)(q–1)]= mi *1 = mi4、消息也可以用d 加密用e 解密二、流程图三、代码#include <stdio.h>int candp(int a,int b,int c) //数据处理函数,实现幂的取余运算{ int r=1;b=b+1;while(b!=1){r=r*a;r=r%c;b--;}printf("%d\n",r);return r;}int fun(int x,int y) //公钥e 与t 的互素判断{int t;while(y){t=x;x=y;y=t%y;}if(x == 1)return 0; //x 与y 互素时返回0elsereturn 1; //x 与y 不互素时返回1}void main(){int p,q,e,d,m,n,t,c,r;printf("请输入两个素数p,q: ");scanf("%d%d",&p,&q);n=p*q;printf("计算得n 为%3d\n",n);t=(p-1)*(q-1); //求n 的欧拉数printf("计算得t 为%3d\n",t);printf("请输入公钥e: ");scanf("%d",&e);if(e<1||e>t||fun(e,t)){printf("e 不合要求,请重新输入: "); //e<1 或e>t 或e 与t 不互素时,重新输入scanf("%d",&e);}d=1;while(((e*d)%t)!=1) d++; //由公钥e 求出私钥dprintf("经计算d 为%d\n",d);printf("加密请输入1\n"); //加密或解密选择printf("解密请输入2\n");scanf("%d",&r);switch(r){case 1: printf("请输入明文m: "); //输入要加密的明文数字scanf("%d",&m);c=candp(m,e,n);printf("密文为%d\n",c);break;case 2: printf("请输入密文c: "); //输入要解密的密文数字scanf("%d",&c);m=candp(c,d,n);printf("明文为%dd\n",m);break;}}四、运行结果及分析输入的两个素数是21和23,根据n=p*q,计算出n=21*23=483,根据t=(p-1)*(q-1),计算出t=20*22=440,输入与t互素的公钥e,此时输入的e 为13,计算出私钥d为237,选择1进行加密,输入明文123456,调用加密函数后加密的结果为396,与用加密公式ci = mi^e(mod n)进行计算的结果是一样的。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。

二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。

其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。

选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。

计算e关于φ(n)的模逆元d。

公开密钥为(e,n),私有密钥为(d,n)。

加密过程为C=Me mod n,解密过程为M=Cd mod n。

2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。

AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。

每个轮包括字节替换、行移位、列混淆和轮密钥加。

3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。

DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。

四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。

2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。

(完整版)RSA算法实验报告

(完整版)RSA算法实验报告

RSA算法的实现实验原理算法原理RSA公开密钥密码体制。

所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密钥对。

其中(n,e1)为公钥,(n,e2)为私钥。

RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1 mod n;B=A^e2 mod n;密钥生成首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。

假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

密钥分配和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

步骤如下(这里设B为是实现着)(1)B寻找出两个大素数p和q。

(2)B计算出n=p*q和ϕ(n)=)(p-1)*(q-1)。

(3)B选择一个随机数e(0<e<ϕ(n)),满足(e,ϕ(n))=1 (即e与欧拉函数互素ϕ(n))。

(4)B使用欧几里得算法计算e的模余ϕ(n)的乘法逆元素d。

rsa算法实验报告

rsa算法实验报告

rsa算法实验报告RSA算法实验报告摘要:RSA算法是一种非对称加密算法,被广泛应用于网络安全领域。

本实验通过对RSA算法的原理和实现进行了深入研究,并通过编写代码实现了RSA算法的加密和解密过程。

实验结果表明,RSA算法具有较高的安全性和可靠性,能够有效保护数据的机密性和完整性。

一、引言RSA算法是一种基于大数因子分解的非对称加密算法,由Rivest、Shamir和Adleman三位数学家于1977年提出。

它的安全性基于两个大素数的乘积难以分解,因此被广泛应用于数字签名、数据加密等领域。

本实验旨在通过对RSA 算法的原理和实现进行研究,深入了解其加密和解密过程,并通过编写代码实现RSA算法的加密和解密过程。

二、RSA算法原理RSA算法的原理主要包括密钥生成、加密和解密三个过程。

首先,选择两个大素数p和q,并计算它们的乘积n=p*q,然后计算欧拉函数φ(n)=(p-1)*(q-1)。

接下来选择一个整数e,使得1<e<φ(n),且e与φ(n)互质,即e和φ(n)的最大公约数为1。

然后计算e的乘法逆元d,使得(e*d) mod φ(n) = 1。

最后,公钥为(n, e),私钥为(n, d)。

加密过程中,将明文m通过公钥加密为密文c,即c=m^e mod n;解密过程中,将密文c通过私钥解密为明文m,即m=c^d mod n。

三、实验设计本实验使用Python语言编写了RSA算法的加密和解密代码,通过输入明文和密钥,实现了对明文的加密和解密过程。

具体实验步骤如下:1. 选择两个大素数p和q,并计算n=p*q,以及φ(n)=(p-1)*(q-1);2. 选择一个整数e,使得1<e<φ(n),且e与φ(n)互质;3. 计算e的乘法逆元d,使得(e*d) mod φ(n) = 1;4. 将明文m通过公钥加密为密文c,即c=m^e mod n;5. 将密文c通过私钥解密为明文m,即m=c^d mod n。

2023年网络安全RSA算法的实现实验报告

2023年网络安全RSA算法的实现实验报告

网络安全基础教程汇报题目:RSA加密算法学号:专业及班级:计网1102班**:***日期:2023.11.26一、RSA算法简介与应用现实状况RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛承认和应用。

发展至今,电子安全领域旳各方面已经形成了较为完备旳国际规范。

RSA作为最重要旳公开密钥算法,在各领域旳应用数不胜数。

RSA在硬件方面,以技术成熟旳IC应用于多种消费类电子产品。

RSA在软件方面旳应用,重要集中在Internet上。

加密连接、数字签名和数字证书旳关键算法广泛使用RSA。

平常应用中,有比较著名旳工具包Open SSL(SSL,Security Socket Layer,是一种安全传播协议,在Internet上进行数据保护和身份确认。

Open SSL是一种开放源代码旳实现了SSL及有关加密技术旳软件包,由加拿大旳Eric Yang等发起编写旳。

Open SSL应用RSA实现签名和密钥互换,已经在多种操作系统得到非常广泛旳应用。

此外,家喻户晓旳IE浏览器,自然也实现了SSL协议,集成了使用RSA技术旳加密功能,结合MD5和SHA1,重要用于数字证书和数字签名,对于习惯于使用网上购物和网上银行旳顾客来说,几乎每天都在使用RSA技术。

RSA更出目前规定高度安全稳定旳企业级商务应用中。

在当今旳企业级商务应用中,不得不提及使用最广泛旳平台j2ee。

实际上,在j2se旳原则库中,就为安全和加密服务提供了两组API:JCA和JCE。

JCA (Java Cryptography Architecture)提供基本旳加密框架,如证书、数字签名、报文摘要和密钥对产生器;JCA由几种实现了基本旳加密技术功能旳类和接口构成,其中最重要旳是java.security包,此软件包包括旳是一组关键旳类和接口,Java 中数字签名旳措施就集中在此软件包中。

JCE(Java Cryptography Extension) 在JCA旳基础上作了扩展,JCE也是由几种软件包构成,其中最重要旳是javax.crypto包,此软件包提供了JCE加密技术操作API。

RSA算法的实现实验报告

RSA算法的实现实验报告

RSA算法的实现实验报告一、实验目的本实验的主要目的是了解和掌握RSA(Rivest-Shamir-Adleman)算法的原理以及其在加密和解密过程中的具体实现。

通过实践和对比分析,了解RSA算法的安全性和效率,并加深对大数计算的理解。

二、算法原理1.密钥生成(1)选择两个大素数p和q,并计算其乘积n=p*q。

(2)计算n的欧拉函数φ(n)=(p-1)*(q-1)。

(3)选择一个整数e,满足1<e<φ(n),并且e与φ(n)互质,即gcd(e, φ(n)) = 1(4)计算e的乘法逆元d,满足e*d ≡ 1 (mod φ(n))。

(5)公钥为(n,e),私钥为(n,d)。

2.加密加密过程使用公钥对明文进行加密:(1)明文转化为整数m,满足0≤m<n。

(2)计算密文c = m^e mod n。

3.解密解密过程使用私钥对密文进行解密:(1)计算明文m = c^d mod n。

(2)还原明文。

三、实验步骤1.实现大数的运算由于RSA算法的关键在于处理大数运算,我们首先实现了大数的加法、减法和乘法运算,并使用这些运算函数作为之后RSA算法中的基础运算。

2.实现RSA算法的密钥生成(1)随机选择两个大素数p和q。

(2)计算n=p*q。

(3)计算φ(n)=(p-1)*(q-1)。

(4)选择一个满足要求的公钥e。

(5)计算e的乘法逆元d。

(6)生成公钥(n,e)和私钥(n,d)。

3.实现RSA算法的加密和解密(1)输入明文。

(2)使用公钥对明文进行加密。

(3)得到密文。

(4)使用私钥对密文进行解密。

(5)还原明文。

四、实验结果与分析我们使用python语言实现了RSA算法,并进行了一些测试和分析,得到以下结果和结论。

1.RSA算法的安全性2.RSA算法的效率3.实验结果分析我们对一些常见文本进行了加密和解密实验,得到了正确的结果。

实验结果表明,RSA算法能够对数据进行有效的加密和解密,并确保数据的安全性。

RSA实验报告

RSA实验报告

RSA算法实验【实验目的】1.了解RSA算法的基本原理2.掌握RSA算法的实现方法3.通过实际编程了解非对称密码算法RSA的加密和解密过程,同时锻炼编程能力。

【实验环境】1. 应用软件:Microsoft VC++2. 操作系统:Windows XP【实验预备知识点】1. RSA密码系统所基于的数学难题是对大素数的因式分解。

2. RSA算法原理:(1).选择两个大的素数p 和q(典型情况下为1024 位)(2).计算n = p * q 和z =(p-1)*(q-1).(3).选择一个与z 互素的数,将它称为d(4).找到e,使其满足e*d = 1 mod z提前计算出这些参数以后,我们就可以开始执行加密了。

【实验内容】◆自行以2位小素数为p,q,3为公钥e,构造一个小的RSA系统,对“a、b、c、d”这4个字母进行加密,解密◆在密码教学系统中实现RSA运算的大素数、公钥、私钥的生成、明文加解密、分块大小的选择◆了解在不同分块大小的情况下,RSA系统的密文长度也会有所变化◆了解在不同参数的情况下,RSA系统的性能变化【实验步骤】1.熟悉RSA运算原理;2.打开实验程序,如图1;3.选择密钥长度为128、256、512或者1024比特;4.点击“随机求取N,E,D”按钮,得到大整数N,公钥E,密钥D;5.在明文对话框中输入需要加密的明文字符串;6.点击“加密”按钮可获得加密后的密文,点击“解密”按钮可获得解密后的明文;或者7.自己输入大整数N、公钥E、密钥D,然后点击按钮“自己输入N,E,D”就激活明文输入框。

(自己输入的数都是16进制的数)8.在明文对话框中输入需要加密的明文字符串;9.点击“加密”按钮可获得加密后的密文,点击“解密”按钮可获得解密后的明文;10.运算用时:显示的是随机求取N,E,D时,程序运行所需要的时间。

图1 RSA算法实验【实验过程】1.随机求取N,E,D:点击“随机求取N,E,D”按钮,得到下图所示的N,E,D.2.输入明文abcd,点击“加密”按钮,得到加密后的密文。

rsa实验报告

rsa实验报告

rsa实验报告RSA实验报告引言:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于信息安全领域。

本实验旨在通过实际操作,深入了解RSA算法的原理和应用。

一、RSA算法原理RSA算法基于数论中的大数分解问题,其核心原理是利用两个大质数的乘积很容易计算得到,但是将这个乘积分解为两个大质数却非常困难。

以下是RSA算法的具体步骤:1. 选择两个不相等的大质数p和q,并计算它们的乘积n=p*q。

2. 计算n的欧拉函数φ(n)=(p-1)*(q-1)。

3. 选择一个小于φ(n)且与φ(n)互质的整数e作为公钥指数。

4. 计算e的模反元素d,即满足(e*d)%φ(n)=1的整数d,作为私钥指数。

5. 公钥为(n, e),私钥为(n, d)。

6. 加密时,将明文m通过公式c=(m^e)%n计算得到密文c。

7. 解密时,将密文c通过公式m=(c^d)%n计算得到明文m。

二、实验过程1. 生成密钥对首先,我们使用Python编程语言生成RSA密钥对。

通过调用相关库函数,我们可以轻松地生成公钥和私钥。

2. 加密与解密接下来,我们使用生成的密钥对进行加密与解密操作。

我们选择一段文字作为明文,将其转化为整数形式,并使用公钥进行加密。

然后,使用私钥对密文进行解密,还原为明文。

3. 安全性分析RSA算法的安全性基于大数分解的困难性。

由于大质数的乘积很容易计算得到,而将其分解为两个大质数却非常困难,因此RSA算法在理论上是安全的。

然而,在实际应用中,如果选择的大质数不够大或者密钥管理不当,可能会导致算法的安全性受到威胁。

三、实验结果与分析经过实验,我们成功生成了RSA密钥对,并进行了加密与解密操作。

实验结果表明,RSA算法能够有效地实现信息的加密和解密。

四、应用领域RSA算法在信息安全领域有着广泛的应用。

以下是一些常见的应用场景:1. 数字签名RSA算法可以用于生成数字签名,确保数据的完整性和真实性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告姓名:XXXXXXXXX学号:0XXXXX班级:XXXXXXXXX日期:2013/12/*题目:RSA算法实验一、实验环境1.硬件配置:处理器:Inter(R)Core(TM)*******************(4CPUs),~2.4GHz内存:2048MB RAM2.使用软件:(1) 操作系统:win7 旗舰版(2) 软件工具:Microsoft Visual c++ 6.0二、实验涉及的相关概念或基本原理它是第一个既能用于数据加密也能用于数字签名的算法。

算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。

但RSA的安全性一直未能得到理论上的证明。

它经历了各种攻击,至今未被完全攻破。

RSA的安全性依赖于大数分解。

公钥和私钥都是两个大素数(大于100 个十进制位)的函数。

从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。

密钥对的产生。

选择两个大素数,p 和q 。

计算:n = p * q然后随机选择加密密钥e,要求 e 和( p - 1 ) * ( q - 1 ) 互质。

最后,利用Euclid 算法计算解密密钥d,满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。

数e和n是公钥,d是私钥。

两个素数p和q不再需要,应该丢弃,不要让任何人知道。

加密信息m(二进制表示)时,首先把m分成等长数据块m1 ,m2,..., mi ,块长s ,其中<= n, s 尽可能的大。

对应的密文是:ci = mi^e ( mod n ) ( a )解密时作如下计算:mi =ci^d ( mod n ) ( b )RSA 可用于数字签名,方案是用( a ) 式签名,( b )式验证。

具体操作时考虑到安全性和m信息量较大等因素,一般是先作HASH 运算。

RSA 的安全性。

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。

假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。

目前,RSA 的一些变种算法已被证明等价于大数分解。

不管怎样,分解n是最显然的攻击方法。

现在,人们已能分解多个十进制位的大素数。

因此,模数n 必须选大一些,因具体适用情况而定。

RSA的速度。

由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。

速度一直是RSA的缺陷。

一般来说只用于少量数据加密。

RSA的选择密文攻击。

RSA在选择密文攻击面前很脆弱。

一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。

然后,经过计算就可得到它所想要的信息。

实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:( XM )^d = X^d *M^d mod n前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。

但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction 对文档作HASH处理,或同时使用不同的签名算法。

在中提到了几种不同类型的攻击方法。

RSA的公共模数攻击。

若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。

最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。

设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:C1 = P^e1 mod nC2 = P^e2 mod n密码分析者知道n、e1、e2、C1和C2,就能得到P。

因为e1和e2互质,故用Euclidean算法能找到r 和s,满足:r * e1 + s * e2 = 1假设r为负数,需再用Euclidean算法计算C1^(-1),则( C1^(-1) )^(-r) * C2^s = P mod n另外,还有其它几种利用公共模数攻击的方法。

总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。

解决办法只有一个,那就是不要共享模数n。

RSA的小指数攻击。

有一种提高RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。

但这样作是不安全的,对付办法就是e和d都取较大的值。

三、实验内容主要的方法:(1)、public static void GetPrime()方法名称:产生大数的方法。

说明:利用Java语言的中的java.math.BigInteger类的方法中随机产生大数。

(2)、public static boolean MillerRobin(BigInteger num)方法名称:判断是否是素数的方法。

参数说明:num是由GetPrime方法产生的大数。

说明:这个方法判断GetPrime方法传过来的是否是一个素数,是就返回true,否就返回false。

(3)、public static BigInteger powmod( BigInteger a, BigInteger t, BigInteger num ) 方法名称:大数的幂运算方法。

说明:这个方法对传入的大数进行幂运算。

(4)、public static BigInteger invmod(BigInteger a, BigInteger b)方法名称:大数的取模运算方法。

说明:这个方法对大数进行取模运算。

(5)、public static String Encode(String inStr,BigInteger PrimeP,BigInteger PrimeQ,BigInteger n,int nLen,int m,JTextField d)方法名称:加密算法。

参数说明:inStr是从界面输入的明文。

PrimeP和PrimeQ是由GetPrime方法产生的两个大素数。

n是由PrimeP和PrimeQ得到的值。

nLen为n的长度。

d为公钥。

(6)、public static String Decode(String inStr,BigInteger PrimeP,BigInteger PrimeQ,BigInteger n,int nLen,int m,JTextField e) 方法名称:解密算法。

参数说明:inStr是从界面输入的明文。

PrimeP和PrimeQ是由GetPrime方法产生的两个大素数。

n是由PrimeP和PrimeQ得到的值。

nLen为n的长度。

e为私钥。

流程图:RSA公钥加密算法流程图:RSA私钥解密算法流程图:主要代码:①判定一个数是否为素数bool test_prime(Elemtype m){if(m<=1){return false;}else if(m==2){return true;}else{for(int i=2;i<=sqrt(m);i++){if((m%i)==0){return false;break;}}return true;}②将十进制数据转化为二进制数组void switch_to_bit(Elemtype b,Elemtype bin[32]){ int n=0;while(b>0){bin[n]=b%2;n++;b/=2;}③求最大公约数Elemtype gcd(Elemtype a,Elemtype b){order(a,b);int r;if(b==0){return a;}else{while(true){r=a%b;a=b;b=r;if(b==0){return a;break;}}}④用扩展的欧几里得算法求乘法逆元Elemtype extend_euclid(Elemtype m,Elemtype bin){order(m,bin);Elemtype a[3],b[3],t[3];a[0]=1,a[1]=0,a[2]=m;b[0]=0,b[1]=1,b[2]=bin;if(b[2]==0){return a[2]=gcd(m,bin);}if(b[2]==1){return b[2]=gcd(m,bin);}while(true){if(b[2]==1){return b[1];break;}int q=a[2]/b[2];for(int i=0;i<3;i++){t[i]=a[i]-q*b[i];a[i]=b[i];b[i]=t[i];}}⑤快速模幂算法Elemtype modular_multiplication(Elemtype a,Elemtype b,Elemtype n){ Elemtype f=1;Elemtype bin[32];switch_to_bit(b,bin);for(int i=31;i>=0;i--){f=(f*f)%n;if(bin[i]==1){f=(f*a)%n;}}return f;}⑥产生密钥void produce_key(){cout<<"输入素数 p 和 q:";cin>>p>>q;while(!(test_prime(p)&&test_prime(q))){ cout<<"输入错误,请重新输入!"<<endl;cout<<"输入素数 p 和 q:";cin>>p>>q;};pr.n=p*q;pu.n=p*q;fn=(p-1)*(q-1);cout<<"fn为:"<<fn<<endl;cout<<"输入随机数e:";cin>>e;while((gcd(fn,e)!=1)){cout<<"e输入错误,请重新输入!"<<endl;cout<<"输入随机数e:";cin>>e;}pr.d=(extend_euclid(fn,e)+fn)%fn;pu.e=e;flag=1;cout<<"公钥(e,n):"<<pu.e<<","<<pu.n<<endl; cout<<"私钥d:"<<pr.d<<endl;cout<<"请输入下一步操作序号:"<<endl;}⑦加密void encrypt(){if(flag==0){cout<<"setkey first:"<<endl;produce_key();}cout<<"输入明文 m:";cin>>m;c=modular_multiplication(m,pu.e,pu.n);cout<<"密文c 为:"<<c<<endl;cout<<"请输入下一步操作序号:"<<endl;}⑧解密void decrypt(){if(flag==0){cout<<"setkey first:"<<endl;produce_key();}cout<<"输入密文 c:";cin>>c;m=modular_multiplication(c,pr.d,pr.n);cout<<"明文m 为:"<<m<<endl;cout<<"请输入下一步操作序号:"<<endl;}主要功能函数:求最大公约数、扩展的欧几里得算法求乘法逆元、快速模幂算法四、实验总结分析1、实验结果2、心得体会本次实验对输入的任意一段明文字母,实现了输出对应密钥的密文字母。

相关文档
最新文档