RSA公钥密码的实现
实验目的:
(1)帮助学生掌握RSA公钥系统的密钥生成、加密和解密的过程,能够利用所学过的编程语言熟悉RSA公钥加密算法流程与编程实现加密算法。掌握编程实现实际中问题的方法,提高解决问题的能力。
(2)要求学生掌握算法的程序实现的方法,能应用密码算法的特点,设计合适的交互界面,并能正确实现应用编程。
(3)要求学生掌握用规范的方法书写实验报告。
实验仪器设备/实验环境
PC Windows操作系统,使用Java语言编程,或者使用数学软件MATLAB、Maple编程,以下使用的是Visual C++ 6.0
实验原理
RSA公钥密码原理
实验内容
解密:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int p,q;//定义p,q
cout<<"输入p、q (p、q为质数,不支持过大)"<< endl;//输出"输入p、q (p、q为质数,不支持过大),并且换行
cin>>p>>q;//输入p,q
int m=p*q;//定义m=p*q
int n=(p-1)*(q-1);//定义n=(p-1)*(q-1)
int e;//定义e
cout<<"输入e (e与"<<n<<"互质) 且 1<e<"<<n<<endl;//输出 "输入e (e与"<<n<<"互质) 且 1<e<
cin>>e;//输入e
int d;//定义d
for(d=1;;d++)
{
if(d*e%n==1)
break;
}
//循环 找出d使得ed=1(mod n)
cout<<endl<<endl;
cout<<"{ "<<e<<","<<m<<" }"<<"为公钥"<<endl;
cout<<"{ "<<d<<","<<m<<" }"<<"为私钥"<<endl;
cout<<endl<<endl;
int after;
cout<<"输入密文"<<endl;
cin>>after;
int before;
int i;
before=after%n;
for(i=1;i<d;i++)
before=(before*after)%m;
//计算C^d=m(mod n)
cout<<"明文为"<<endl;
cout<<before<<endl;
}
结果:

加密:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int p,q;//定义p,q
cout<<"输入p、q (p、q为质数,不支持过大)"<< endl;//输出"输入p、q (p、q为质数,不支持过大),并且换行
cin>>p>>q;//输入p,q
int m=p*q;//定义m=p*q
int n=(p-1)*(q-1);//定义n=(p-1)*(q-1)
int e;//定义e
cout<<"输入e (e与"<<n<<"互质) 且 1<e<"<<n<<endl;//输出 "输入e (e与"<<n<<"互质) 且 1<e<
cin>>e;//输入e
int d;//定义d
for(d=1;;d++)
{
if(d*e%n==1)
break;
}
//循环 找出d使得ed=1(mod n)
cout<<endl<<endl;
cout<<"{ "<<e<<","<<m<<" }"<<"为公钥"<<endl;
cout<<"{ "<<d<<","<<m<<" }"<<"为私钥"<<endl;
cout<<endl<<endl;
int before;
cout<<"输入明文"<<endl;
cin>>before;
int after;
int i;
after=before%n;
for(i=1;i<e;i++)
after=(after*before)%m;
//计算m^e=C(mod n)
cout<<"密文为"<<endl;
cout<<after<<endl;
}
结果:

实验心得
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
整个加密解密的过程大概是;首先假设甲方要向乙方发送消息,那么甲方需要对消息加密,乙方需要对消息解密,加密算法分为对称性和非对称性2种算法,根据加密解密所使用的秘钥相不相同来区分,我们要讨论的RSA算法就是非对称性的,也就是加密的公钥和解密的私钥是不同的。由于公钥是公开的,可以给别人看到所以不需要保护,只需要保护好私钥不被窃取即可,通常私钥的窃取都是在传输的过程中进行的,所以只要防止私钥的传输就好了。因此甲方发送消息给乙方,所以乙方产生公钥和私钥,之后将公钥公开,用于甲方对消息加密,然后乙方自己拥有私钥,只需要使用私钥解密即可。