C++实现简单的RSA加密

#include <iostream>
#include <stdio.h>
using namespace std;

int primeNum(int num);//判断素数
int coprime(int a, int b);//判断互素
int candp(int a, int b, int c);  //计算密文

int key();//生成密钥
int encryption();//加密
int decode();//解密


int main()
{
	cout << "RSA加密算法"<<endl;

	while (1)
	{
		cout << "---------------------------" << endl;
		cout << "请选择功能"<< endl; 
		cout << "1--生成密钥"<< endl; 
		cout << "2--加密"<< endl; 
		cout << "3--解密"<< endl; 
		cout << "4--退出"<< endl; 
		cout << "---------------------------" << endl;
		int i = 0;
		cin >> i;
		switch (i)
		{
			case 1:
				key();
				break;
			case 2:
				encryption();
				break;
			case 3:
				decode();
				break;
			case 4:
				exit(0);
			default:
				cout << "输入错误" << endl;
		}			 
	}
	return 0;
}

//判断是否是素数
int primeNum(int num)
{
	int i, flag = 0;

	for (i = 2; i <= num / 2; ++i)
	{
		// 符合该条件不是素数
		if (num % i == 0)
		{
			flag = 1;
			break;
		}
	}
	//flag为1,不是素数;为0,是素数
	return flag;
}
//判断两个数是否互素
int coprime(int a, int b)
{
	int t;
	if (a < b)
	{
		t = a; a = b; b = t;
	}
	while (a % b)
	{
		t = b;
		b = a % b;
		a = t;
	}
	//返回值为1,则a,b互素
	return b;
}
//计算密文
int candp(int a, int b, int c) //a--明文或密文   b--指数(e/d)    c--模数
{
	int r = 1;
	b = b + 1;
	while (b != 1)
	{
		r = r * a;
		r = r % c;
		b--;
	}
	return r;
}
//生成密钥
int key()
{
	int p, q, m, n, e, d;
	cout<<"请输入 p,q: "<<endl;    //输入两个素数q,p
	cin >> p >> q;
	if (primeNum(p) != 0 || primeNum(q) != 0)
	{
		cout << "输入的p或q不是素数" << endl;
		return 0;
	}
	n = p * q;
	
	//m为n的欧拉函数
	m = (p - 1) * (q - 1);
	
	cout<<"请输入私钥d: "<<endl;
	cin >> d;
	e = 1;
	//求d的乘法逆
	while (((e * d) % m) != 1) e++;

	cout<<"n = p * q = "<<n << endl;
	cout<<"m = (p - 1) * (q - 1) = " <<m << endl;
	cout<<("公钥(e,n)为:(")<<e<<","<<n<<")"<<endl;
	cout << ("私钥(d,n)为:(")<<d<<","<<n <<")"<< endl;
	return 0;
}
//加密
int encryption()
{
	int n, e,x, y;
	cout << "请输入公钥(e,n)" << endl;
	cin >> e >> n;
	cout<<"请输入明文: (明文需小于"<<n<<")"<<endl;  //计算密文
	cin >> x;

	y = candp(x, e, n);
	cout<<"密文为:"<<y<<endl;
	return 0;
}
//解密
int decode()
{
	int n,d, x, y;
	cout << "请输入私钥(d,n)" << endl;
	cin >> d >> n;
	cout << "请输入密文: ";  //计算密文
	cin >> y;

	x = candp(y, d, n);
	cout << "明文为:" << x << endl;
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值