密码学-RSA加密解密算法的实现课程设计报告
密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》专业:信息工程(信息安全)班级:1132102学号:************姓名:***指导老师:***时间:2014年1月10号一、课程设计的目的当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。
RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。
它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。
公钥加密算法中使用最广的是RSA。
RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。
而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。
此外,RSA加密系统还可应用于智能IC卡和网络安全产品。
二、RSA算法的编程思路1.确定密钥的宽度。
2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。
3.计算出p和q的乘积n 。
4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。
5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。
6.得公钥(e ,n ), 私钥 (d , n) 。
7.公开公钥,但不公开私钥。
8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:C = Pe mod n9.将密文C解密为明文P,计算方法为:P = Cd mod n然而只根据n和e(不是p和q)要计算出d是不可能的。
RSA算法课程设计报告

码体制到目前为止还是一种被认可为安全的体制。
目
1课题综述
课题来源
课题意义
预期目标
2系统分析
基础知识
总体方案
功能模块
3系统设计
算法描述
录
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
流程图
4代码编写
5运行与测试
产生公钥和密钥
加密与解密
密体制保证了秘密信息的安全。
预期目标
在充分理解RSA加密体制概念和原理的基础上,用Microsoft Visual
C++实现RSAffl密与解密,演示公钥与密钥的生成及加密与解密的过程。
2系统分析
基础知识
2.1.1素数
称整数p(p>1)是素数,如果p的因子只有士1,士p。
称c是两个整数a、b的最大公因子,如果
a二qn+r,0<r<n,
其中x为小于或等于x的最大整数。
用a mod n表示余数r
如果(a modn)=(b modn),则称两整数a和b模n同余,记为a三b modn。
称与a模n同余的数的全体为a的同余类,记为[a],称a为这个同余类的十一.r十表示元素。
RSA加密解密的设计与实现

上海电力学院《应用密码学》课程设计题目:RSA加密解密的设计与实现院系:计算机科学与技术学院专业年级:2010级学生姓名:李正熹学号:20103273指导教师:田秀霞2013年1月8日目录目录1.设计要求2.开发环境与工具3.设计原理(算法工作原理)4.系统功能描述与软件模块划分5.设计核心代码6.参考文献7. 设计结果及验证8. 软件使用说明9. 设计体会附录1.设计要求1 随机搜索大素数,随机生成公钥和私钥2 用公钥对任意长度的明文加密3 用私钥对密文解密4 界面简洁、交互操作性强2.开发环境与工具Windows XP操作系统Microsoft Visual C++ 6.01.创建rsa工程2.在rsa工程中创建20103273 李正熹cpp文件3.设计原理RSA算法简介公开密码算法与其他密码学完全不同,它是基于数学函数而不是基于替换或置换。
与使用一个密钥的对称算法不同,公开密钥算法是非对称的,并且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。
公开密钥算法有RSA、Elgamal等。
RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman 在1978年提出来的,并以他们的名字的有字母命名的。
RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是目前应用广泛的公钥密码体制。
RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。
并且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。
4.系统功能描述与软件模块划分功能:1.进行加密加密第一步,随机两个素数p和q,并求出n = p*q,然后再求出n的欧拉函数值phi。
第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e 的乘法逆元。
密码学实验报告(AES,RSA)

华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] AES-128加密算法实现 一、实验目的及要求(1)用C++实现;(2)具有16字节的加密演示;(3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB.二、所用仪器、设备计算机、Visual C++软件。
三. 实验原理3.1、设计综述AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。
State 可以用4×4的矩阵表示。
AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。
AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。
最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。
表2 AES 参数比特。
3.2、字节代替(SubBytes )AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。
例如,十六进制数{84}。
对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。
S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。
S 盒按照以下方式构造:(1) 逐行按照升序排列的字节值初始化S 盒。
第一行是{00},{01},{02},…,{OF};第二行是{10},{l1},…,{1F}等。
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.知识目标:a.了解RSA加密算法的历史背景和发展过程。
b.掌握RSA算法的基本原理,包括公钥和私钥的生成、加密和解密过程。
c.理解RSA算法的数学基础,如大数分解、欧拉定理等。
d.熟悉RSA算法在现代通信技术中的应用场景。
2.技能目标:a.能够使用编程语言实现简单的RSA加密和解密功能。
b.能够分析RSA算法的优缺点,并根据实际需求选择合适的加密算法。
c.能够运用RSA算法解决实际问题,如数字签名、安全通信等。
3.情感态度价值观目标:a.培养学生对计算机科学和网络安全领域的兴趣,提高学生主动学习的积极性。
b.使学生认识到信息安全的重要性,增强学生的社会责任感和职业道德。
c.培养学生团队协作、创新思考和解决问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.RSA加密算法的基本概念和历史背景。
2.RSA算法的数学原理,如大数分解、欧拉定理等。
3.RSA公钥和私钥的生成过程,以及加密和解密方法。
4.RSA算法的应用场景,如数字签名、安全通信等。
5.RSA算法的优缺点分析,以及与其他加密算法的比较。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如:1.讲授法:教师讲解RSA加密算法的基本原理、数学基础和应用场景。
2.案例分析法:分析实际案例,让学生了解RSA算法在网络安全领域的应用。
3.实验法:引导学生动手实践,编写程序实现RSA加密和解密功能。
4.讨论法:学生分组讨论,分析RSA算法的优缺点,并提出改进意见。
四、教学资源为了支持教学内容和教学方法的实施,本课程将采用以下教学资源:1.教材:《计算机网络安全技术与应用》。
2.参考书:《密码学导论》、《信息安全原理与实践》。
3.多媒体资料:PPT课件、教学视频、网络资源等。
4.实验设备:计算机、网络设备、编程环境等。
RSA加解密的设计与实现 程序+报告

上海电力学院《应用密码学》课程设计题目:RSA加解密的设计与实现院系:计算机与信息工程学院专业年级:信息安全专业2009252班学生姓名:学号:20093464指导教师:温蜜2011年1月6日目录一、设计要求 (3)二、开发环境与工具 (3)三、设计原理 (3)四、系统功能描述与软件模块划分 (4)五、设计核心代码 (6)六、设计结果及验证 (16)七、软件使用说明 (17)八、参考资料 (18)九、设计体会 (18)一、设计要求1、随机搜索大素数,随机生成公钥和私钥;2、用公钥对任意长度的明文加密;3、用私钥对密文解密;4、界面简洁、交互操作性强。
5、(可选)实现对汉字的加解密,把加密结果存放在文本文档二、开发环境与工具开发环境:win7 64位操作系统开发工具:VC++6.0三、设计原理(算法工作原理)首先设计一个能存放足够大数的类CBigInt ,这个类是把很大的数分解成一个个int 类型的数来i 存储的。
输入你要求的密钥位数,然后用rand ()函数生成一个个32位数,拼接成大数,进行素性检测,是素数就返回,就这样就产生了公钥(e,n)和私钥(d,n),然后利用 公式c=m^e mod n ,得到密文,保存得到的密文到文本文档,再用公式m=c^d mod n ,得到明文。
算法路程图如下:N 开始输入明文输入需要生成的密钥长度 产生随机大数进行拉宾-米勒 素性检测 通过? 加密解密验证结束 Y四、系统功能描述与软件模块划分CBigInt类的功能:class CBigInt{public:unsigned m_nLength;unsigned long m_ulV alue[BI_MAXLEN];CBigInt();~CBigInt();void Mov(unsigned __int64 A);void Mov( CBigInt& A);CBigInt Add( CBigInt& A); //加法CBigInt Sub(CBigInt& A); //减法CBigInt Mul(CBigInt& A); //乘法CBigInt Div(CBigInt& A); //除法CBigInt Mod( CBigInt& A); //模CBigInt Add(unsigned long A);CBigInt Sub(unsigned long A);CBigInt Mul(unsigned long A);CBigInt Div(unsigned long A);void FromString(char *,int len);int ToString(char *);unsigned long Mod(unsigned long A);int Cmp( CBigInt& A);CBigInt ModExp(CBigInt& A, CBigInt& B);CBigInt RsaTrans( CBigInt& A, CBigInt& B);int RabinMiller();CBigInt Euc(CBigInt& A);void GetPrime( unsigned bits);void Put(char *str, unsigned int system) ;void Get(char* str, unsigned int system);friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);CBigInt operator +( unsigned long b);CBigInt operator -( unsigned long b);CBigInt operator *( unsigned long b);CBigInt operator /( unsigned long b);};void Mov( CBigInt& A);void Mov(unsigned __int64 A)是实现大数复制的功能用法为a.Mov(b),就是把大数b赋给a CBigInt Add( CBigInt& A) 实现大数加法功能,用法为a.Add(b),等介于a+b;CBigInt Sub(CBigInt& A)实现大数减法功能,用法为a.Sub(b),等价于a-b;CBigInt Mul(CBigInt& A)实现大数乘法功能,用法为a.Mul(b),等价于a*b;CBigInt Div(CBigInt& A)实现大数除法功能,用法为a.Div(b),等价于a/b;CBigInt Mod( CBigInt& A)实现大数的模功能,用法为a.Mod(b)等价于a%b;void FromString(char *,int len)实现字符型的数转换成大数的功能,用法为a.FromString(m,n),意思是把n位的字符型m赋给大数a;int ToString(char *)实现把大数转变成字符型输出,用法为a.ToString(m),意思是把大数转换成字符型m;int Cmp( CBigInt& A)实现大数比较,用法为C=a.Cmp(b),如果a>b,则c=1,如果a=b则c=0,如果a<b=-1;CBigInt ModExp(CBigInt& A, CBigInt& B)实现大数模幂功能,用法为a=bModExp(c,d),等价于a=b^c mod d;void GetPrime( unsigned bits)获得大素数的函数,用法为a.GetPrime(n),则a获得一个32*bits 位的大素数;void Put(char *str, unsigned int system) 把字符型的转换成10进制或16进制的大数void Get(char* str, unsigned int system)把大数还原成10进制或16进制的字符型变量friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);这些是实现运算符重载的,方便与用户进行大整数的各种运算;class RSA{public:void GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d);CBigInt Rsajiami(char* m,int len,CBigInt e,CBigInt n);//加密获得密文void Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs);//解密获得明文void Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa);加密void Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa);解密private:CBigInt p,q,n,_n,e,d;//RSA主要数据};GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d)是生成len位的密钥以及p,q,n,_n,的函数Rsajiami(char* m,int len,CBigInt e,CBigInt n)是对明文进行加密,得到二进制密文的操作Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs)是对密文进行解密,并把明文转换成char类型的数据Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa)对明文进行加密,并显示所得密文以及加密多用时间Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa)对密文进行解密,并显示所得明文以及解密时间进行输出五、设计核心代码Cmp(CBigInt& A){if(m_nLength>A.m_nLength)return 1;if(m_nLength<A.m_nLength)return -1;for(int i=m_nLength-1;i>=0;i--){if(m_ulV alue[i]>A.m_ulV alue[i])return 1;if(m_ulV alue[i]<A.m_ulV alue[i])return -1;}return 0;}这个函数实现了大数的比较,如果a的长度小于b,那么a<b,如果a的长度大于b,那么a>b,如果ab的长度相等,那么,我们就从他们的高位开始比较,谁的高位比较大,那么谁就大。
RSA算法的C实现课程设计报告

RSA算法的C实现课程设计报告RSA算法的C实现课程设计报告课程设计报告------------------RSA算法实现院(系):专业:班级:学生:学号:指导教师:10月10日目录1.RSA算法介绍与应用现 (3)2.算法原理 (3)3.RSA算法数论基础 (4)3.1.单向和陷门单向函数 (4)3.2.同余及模运算 (4)3.3.欧拉函数、欧拉定理和费尔马定理 (5)3.4.乘法逆元及其求法…………………………………………..5.4. RSA算法的各环节 (6)4.1.RSA公钥加密解密概述 (6)4.2. RSA签名算法 (6)4.3.大数运算处理 (7)4.4.大素数的产生 (8)5. RSA的安全性 (8)6. 代码实现: (10)7. RSA算法结果分析 (15)7.1.主界面初始化 (15)7.2.设置密钥 (15)7.3.对明文加密 (16)7.4.对密文解密 (17)8. 总结与展望 (17)9. 参考文献 (18)1.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技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
密码学课程报告《RSA加密解密算法》专业:信息工程(信息安全)班级:1132102学号:************姓名:***指导老师:***时间:2014年1月10号一、课程设计的目的当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。
RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。
它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。
公钥加密算法中使用最广的是RSA。
RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。
而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。
此外,RSA加密系统还可应用于智能IC卡和网络安全产品。
二、RSA算法的编程思路1.确定密钥的宽度。
2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。
3.计算出p和q的乘积n 。
4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。
5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。
6.得公钥(e ,n ), 私钥 (d , n) 。
7.公开公钥,但不公开私钥。
8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:C = Pe mod n9.将密文C解密为明文P,计算方法为:P = Cd mod n然而只根据n和e(不是p和q)要计算出d是不可能的。
因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密三、程序实现流程图:1、密钥产生模块:2、解加密流程模块:四、部分算法代码判定一个数是否为素数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;}}求最大公约数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]; }}}加密void encrypt() {if(flag == 0) {cout<<"setkey first:"<<endl;produce_key();}label3:cout<<"input m:";cin>>m;while (!cin){cin.clear();char a;cin>>a;cout<<"wrong input,Please enter an integer !"<<endl;goto label3;}c = modular_multiplication(m,pu.e,pu.n);cout<<"c is:"<<c<<endl;}解密void decrypt() {if(flag == 0) {cout<<"setkey first:"<<endl;produce_key();}label4:cout<<"input c:";cin>>c;while (!cin){cin.clear();char a;cin>>a;cout<<"wrong input,Please enter an integer !"<<endl;goto label4;}m = modular_multiplication(c,pr.d,pr.n);cout<<"m is:"<<m<<endl;五、部分截图六、程序代码#include <iostream.h>#include <conio.h>#include <math.h>#include <stdlib.h>#include <string.h>int go(int k,char bk[16]);int Transform(int m,int k,int n); int gcd(int a,int b);int IsPrime(int a);go(int k,char bk[16]){int n = 0;while( k > 0) {bk[n] = k % 2;n++;k/= 2;}return k;}int Transform(int m,int k,int n){long int r=1;char bk[16];go(k,bk);for(int i=15; i>=0; i--){r=(r*r)%n;if (bk[i] ==1){r=(r*m)%n;}}return r;}int gcd(int a,int b){for(int i=2;i <=sqrt(a <b?a:b);i++)if ((a%i ==0)&&(b%i==0))return 0;return 1;}int IsPrime(int a){for(int i=2;i <=sqrt(a);i++)if(a%i==0) return 0;return 1;}void main(){int c,e,d,m,n,z,p,q;cout << "\t************简单RSA加密解密算法***********\n\n "; cout <<"请输入p: ";cin>> p;while(!IsPrime(p)){cout << "您输入的p不是素数,请重新输入: ";cin>> p;}cout << "请输入q: ";cin>> q;while(!IsPrime(q)){cout << "您输入的q不是素数,请重新输入: ";cin>> q;}cout << "\n由p和q求得n和ф(n) " <<endl;n=p*q;z=(p-1)*(q-1);cout << "n =" <<n << " and " << "ф(n) =" <<z <<endl;cout <<endl << "请输入e: ";cin>> e;while (!gcd(e,z)){cout << "e应该和ф(n)互素: ";cin>> e;}cout << "求得解密密钥" ;d=1;while (((e*d)%z)!=1) d++;cout << "d =" << d << endl;cout <<endl << "请输入明文m: " ;cin>> m;while (m>=n||m<=0){cout << "请重新输入明文m(0<m<"<<n<<")";cin>> m;}cout << "求得密文为:";c=Transform(m,e,n);cout << "c =" <<c <<endl;cout <<endl << "请输入密文c: " ;cin>> c;cout << "求得明文为:" ;m=Transform(c,d,n);cout << "m =" <<m <<endl;getch();}七、心得体会通过做此次课程设计,对RSA加密解密算法有了更近一步的了解。
RSA通过使用公钥加密、私钥解密,完成了乙方到甲方的一次数据传递,通过私钥加密、公钥解密,同时通过私钥签名、公钥验证签名,完成了一次甲方到乙方的数据传递与验证,两次数据传递完成一整套的数据交互!掌握了RSA算法的基本原理、体验应用效果,以及如何判断一个数是否为素数,以及用扩展的欧几里得算法求乘法逆元问题,以及解密和加密算法。