3,881
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
//判断数字是否为素数
bool IsPrime(long N)
{
if (N == 2 || N == 3 ||
N == 5 || N == 7)
{
return true;
}
if (N % 2 == 0 || N % 3 == 0 ||
N % 5 == 0 || N % 7 == 0)
{
return false;
}
long sqrtN = long(sqrt(N)) + 1;
for (long i = 3; i < sqrtN; i += 2)
{
if (N % i == 0)
{
return false;
}
}
return true;
}
//查找大于a,小于b范围内的一个随机素数
long FindPrime(long a, long b)
{
long N = -1;
long n = b - a + 1;
srand(time(NULL));
do
{
N = rand() % n + a;
}while (!IsPrime(N));
return N;
}
//求m,n的最大公约数
long gcd(long m, long n)
{
if (m < n)
{
long tmp = m;
m = n;
n = tmp;
}
if (n == 0)
return m;
else
return gcd(n, m%n);
}
//求a的n次方
long mypow(long a, long n)
{
long tmp = a;
for (int i = 2; i <= n; i++)
{
tmp = tmp * a;
}
return tmp;
}
int main()
{
long a = 10, b = 20;
long p = FindPrime(a, b);
long q = FindPrime(a, b);
while (p == q)
{
q = FindPrime(a, b);
}
long R = (p-1)*(q-1);
//查找公钥r
long r = 2;
do
{
r++;
}while (gcd(r, R) != 1);
cout<<"p = "<<p<<endl
<<"q = "<<q<<endl
<<"r = "<<r<<endl;
//查找密钥m
long m = 2;
for (m = 2; m <= R; m++)
{
if ((r*m) % R == 1)
{
break;
}
}
cout<<"R = "<<R<<endl;
cout<<"m = "<<m<<endl;
long n = p*q;
cout<<"n = "<<n<<endl;
//加密解密测试
long M = 20; //要加密的内容
cout<<"明文 = "<<M<<endl;
long Mm = mypow(M, m)%n;
cout<<"密文 = "<<Mm<<endl;
long Dm = mypow(Mm, r)%n;
cout<<"解密 = "<<Dm<<endl;
return 0;
}