RSA算法的简单实现(C++)

#include<bits/stdc++.h>
using namespace std;
int p,q,n,e,d;//{e,n}作为公钥  {d,n}作为私钥 
int fn;
int m,c,new_m;
int max_pq,min_pq;

bool isPrime(int n)//判断是否是素数 ,小素数可以 ,大一点的使用素性判断算法 
{
	if(n%2==0)
	{
		return false;
	}
	for(int i=3;i<=sqrt(n);i+=2)
	{
		if(n%i==0)
		{
			return false;
		}
	}
	return true;
}
int modpow(int n,int m,int mod)//取模指数计算 
{
	if(m==0)
	{
		return 1;
	}
	if(m==1)
	{
		return n%mod;
	}
	if(m%2==0)
	{
		return modpow((n*n)%mod,m/2,mod);
	}
	else
	{
		return (modpow((n*n)%mod,m/2,mod)*n)%mod;
	}
}
void RandomPQ()//随机生成PQ两个互质的数字 
{
	while(1)
	{
		p = (rand()%(max_pq-min_pq))+min_pq;
		if(isPrime(p))
		{
			break;
		}
	}
	while(1)
	{
		q = (rand()%(max_pq-min_pq))+min_pq;
		if(p!=q&&isPrime(q))
		{
			break;
		}
	} 
	cout<<"q:"<<q<<endl;
	cout<<"p:"<<p<<endl;
}
void GetN()//根据PQ生成n 
{
	n=q*p;
	cout<<"n:"<<n<<endl;
} 
void Euler()//计算欧拉函数(n)
{
	fn = (q-1)*(p-1);
	cout<<"fn:"<<fn<<endl;
}
void GetE()//计算e   满足gcd(欧拉函数(n),e)=1  e< 欧拉函数(n);
{
	if(!isPrime(fn))
	{
		e=1;
	}
	for(int i=(fn-1);i>=1;i--)
	{
		if(__gcd(fn,i)==1)
		{
			e=i;
			break;
		}
	}
	cout<<"e:"<<e<<endl;
}
//求d  扩展欧几里得  
int ex_gcd(int a,int b,int &x,int &y)//扩展欧几里得 
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int r=ex_gcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return r;
}
int mod_reverse(int a,int n)//ax=1(mod n) 求a的逆元x d*e=1mod(m)
{
    int flag,x,y;
    flag=ex_gcd(a,n,x,y);
    if(flag==1)
        return (x%n+n)%n;
    else
        return -1;
} 
void GetD()//计算d,小数字可以,大数字不行 ,稍微大一点的使用扩展欧几里得算法 
{
	//e*i-1=j*fn;
	/*for(int i=1;i<fn;i++)
	{
		if(e*i%fn==1)
		{
			d=i;
			cout<<"d:"<<d<<endl;
			return ;
		}
	}*/
	d=mod_reverse(e,fn);
	cout<<"d:"<<d<<endl;
}
void Encode()//加密 
{
	//c=m^e mod n;
	cout<<"old m:"<<m<<endl;
	c = modpow(m,e,n);
	cout<<"c:"<<c<<endl;
}
void Decode()//解密 
{
	new_m=modpow(c,d,n);
	cout<<"new m:"<<m<<endl;
}
void RSA()
{
	cout<<"*********"<<endl;
	RandomPQ();//随机生成PQ两个互质的数字
	GetN();//根据PQ生成n
	Euler();//计算欧拉函数(n)
	GetE();//计算e
	GetD();//计算d
	cout<<"*********"<<endl<<endl;
}
int main()
{
	srand(time(NULL));//设定随机种子变量
	max_pq = 300;//pq的上界 
	min_pq = 5; //pq的下界
	int sum=0;
	for(int i=0;i<100;i++)//循环测试100次 
	{
		RSA();//实际运行代码 
		if(e==d)
		{
			sum++;
		}
	} 
	cout<<sum<<endl;
	return 0;
} 
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是RSA算法的C++代码实现: ```c++ #include <iostream> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; // 判断是否为质数 bool is_prime(int num) { if(num == 2) return true; if(num < 2 || num % 2 == 0) return false; for(int i = 3; i <= sqrt(num); i += 2) { if(num % i == 0) return false; } return true; } // 生成随机质数 int get_prime() { int num; do { num = rand() % 100 + 2; // 生成 2-101 之间的随机数 } while(!is_prime(num)); return num; } // 求最大公因数 int gcd(int a, int b) { if(b == 0) return a; return gcd(b, a % b); } // 求欧拉函数值 int euler(int p, int q) { return (p - 1) * (q - 1); } // 生成密钥 void generate_key(int &e, int &d, int &n) { srand(time(NULL)); // 以当前时间作为随机数种子 int p = get_prime(); // 生成第一个质数 int q = get_prime(); // 生成第二个质数 int phi = euler(p, q); // 求欧拉函数值 n = p * q; // 计算模数 do { e = rand() % (phi - 2) + 2; // 生成随机数 e,2 <= e <= phi-1 } while(gcd(e, phi) != 1); // 判断 e 是否与 phi 互质 // 计算模反元素 d int k = 1; while((k * phi + 1) % e != 0) k++; d = (k * phi + 1) / e; } // 加密函数 int encrypt(int m, int e, int n) { int c = 1; for(int i = 0; i < e; i++) { c = (c * m) % n; } return c; } // 解密函数 int decrypt(int c, int d, int n) { int m = 1; for(int i = 0; i < d; i++) { m = (m * c) % n; } return m; } int main() { int e, d, n; generate_key(e, d, n); cout << "公钥为:" << e << ", " << n << endl; cout << "私钥为:" << d << endl; int m, c; cout << "请输入要加密的明文:"; cin >> m; c = encrypt(m, e, n); cout << "加密结果为:" << c << endl; int m2; m2 = decrypt(c, d, n); cout << "解密结果为:" << m2 << endl; return 0; } ``` 以上代码实现RSA算法的密钥生成、加密和解密功能。在生成密钥时,我们采用了随机选择两个质数的方式,以增加算法的安全性和随机性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值