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

合集下载

密码学-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算法课程设计报告

RSA算法课程设计报告
SK); PK公开,SK保密;从PK推出SK是很困难的;A、E双方通 信时,A通过任何途径取得E的公钥,用E的公钥加密信息,加密后的信 息可通过任何不安全信道发送。E收到密文信息后,用自己私钥解密恢复 出明文。公钥密码体制已成为确保信息的安全性的关键技术。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加密解密的设计与实现

上海电力学院《应用密码学》课程设计题目: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,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算法的实现实验报告一、实验目的本实验的主要目的是了解和掌握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加密解密课程设计一、教学目标本课程旨在让学生了解和掌握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加解密的设计与实现  程序+报告

上海电力学院《应用密码学》课程设计题目: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算法的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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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算法的基本原理、体验应用效果,以及如何判断一个数是否为素数,以及用扩展的欧几里得算法求乘法逆元问题,以及解密和加密算法。

相关文档
最新文档