实验6-有关RSA加解密的题目-C++

实验6实验内容与步骤:
RSA加解密算法步骤
①随机地选择两个大素数 p和 q,而且保密;
②计算n=pq,将 n公开;
③计算φ(n)=(p-1)(q-1),对φ(n)保密;
④随机选取一个正整数e,1<e<φ(n)且(e,φ(n))=1,将 e公开;
⑤根据 ed=1 mod φ(n),求出d,并对d保密;
⑥加密运算:C=M e mod n
⑦解密运算:M=C d mod n

RSA加解密算法思考
加密
对于明文M<n,密文C = Me (mod n)
思考:如果M>n?
1.把长信息分割成若干段短消息,每段分别加密;
2.先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。
解密
对密文C的解密:M=Cd(mod n)

RSA加解密算法题目
RSA密码示例
选择素数:p=47 和 q=71。
计算n和(n):
n = pq =47×71=3337,
 (n)=(p–1)(q-1)=46×70=3220。
选择e:使gcd(e, 3220)=1,选取e=79;
决定d:de≡1 mod 3220,得d =1019
公开公钥 {79, 3337},
保存私钥 {1019, 3337};
练习:明文M=688 232 687 966 668 3,求密文C.
代码如下

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main(){
	int p=47;
	int q=71;
	int n=3337;
	int _n=3220;
	int e=79;
	int d=1019;
	
	int M[6]={688,232,687,966,668,3};
 //加密运算:C=M e  mod n
 	for(int i=0;i<6;i++){	
 		int m=M[i];
 		//Me次方 数据太大 这样来处理 
 		int number=1; 
 		int num=m;
 		for(int j=0;j<e;j++){
 			number=(number*num)%n;
		 }
		 cout<<number<<" ";
	 }     
}

RSA加解密算法实验任务
实验(1)令 p=3,q=11,d=7,m=5, 编程计算密文 C 。

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//求最大公约数 
int gcd(int m,int n){
	if(n==0){
		return m;
	}else{
		return gcd(n,m%n);
	}
}
int main(){
	int p=3;
	int q=11;
	int d=7;
	int M=5;
	int n=p*q;
	int _n=(p-1)*(q-1);
	//求e
	int e=0;
	for(int i=1;i<_n;i++){
		if(gcd(_n,i)==1  && (d*i)%_n==1){
			e=i;
			//cout<<e<<endl;
		}
	}
	//加密运算:C=M e  mod n
	int C_=pow(M,e);
	int C=C_%n;
	cout<<C; 
}

实验(2)设 RSA 密码的 e=3,n=33,C=9, 编程计算明文 M 。

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//求最大公约数 
int gcd(int m,int n){
	if(n==0){
		return m;
	}else{
		return gcd(n,m%n);
	}
}

//判断是否是素数
bool Prime(int x){
	if(x==1){
		return true;
	}	
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0){
			return false;
		}
	}
	return true;
} 
int main(){
	int e=3;
	int n=33;
	int C=9;
	
	//求pq
	int p=0,q=0;
	for(int i=3;i<n;i++){
		for(int j=3;j<n;j++){
			if(Prime(i)&&Prime(j)&&i*j==n){
				if(gcd(e,(p-1)*(q-1)) ==1){
					p=i;
					q=j;
				}
				
			}
		}
	}
	//cout<<p<<q;
	//求d
	int d;
	int _n=(q-1)*(p-1);
	for(int i=1;i<_n;i++){
		if((i*e)%_n==1){
			d=i;
		}
	} 
	//cout<<d;
	//解密运算:M=C d  mod n  
	 int M_=pow(C,d);
	 int M=M_%n;
	 cout<<M;
}

实验(3)令 p=17,q=11, e=7,试计算 RSA 密码其余参数 。进一步对于 m=88, 计算密文 C 。

#include<bits/stdc++.h>
#include<iostream>
using namespace std;

//求最大公约数 
int gcd(int m,int n){
	if(n==0){
		return m;
	}else{
		return gcd(n,m%n);
	}
}
int main(){
	int p=17;
	int q=11;
	int e=7;
	int M=88;
	
	int n=p*q;
	int _n=(p-1)*(q-1);
	
	cout<<"n: "<<n<<endl;
	cout<<"_n: "<<_n<<endl;
	
	//求d
	int d;
	for(int i=1;i<_n;i++){
		if((i*e)%_n==1){
			d=i;
		}
	} 
	cout<<"d: "<<d<<endl;

	
	//加密运算:C=M e  mod n
	long long C_=pow(M,e);
	int C=C_%n;
	cout<<"密文C: "<<C;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值