根据给的n可以通过sqrt(n)的时间复杂度求出q和p及
for(long long i=2;i*i<=n;i++)
if(n%i==0)
{
printf("%lld\n",i);
break;
}
得
p
=
891234941
p=891234941
p=891234941
q
=
1123984201
q=1123984201
q=1123984201
然后得到
p
h
i
=
(
p
−
1
)
∗
(
q
−
1
)
phi=(p-1)*(q-1)
phi=(p−1)∗(q−1)
又有
e
d
=
1
(
m
o
d
p
h
i
)
ed=1(mod\ phi)
ed=1(mod phi)
可以构造
d
⋅
x
+
p
h
i
⋅
y
=
1
d\cdot x+phi \cdot y=1
d⋅x+phi⋅y=1
然后再利用扩展欧几里得算法可以求得d再模phi下的逆元
e
e
e,扩欧求得的逆元可能是负数所以用加一个模数再对用模数取余可以得到最小正整数解
有了e之后用一个快速幂就可以得到解密明文及
c
e
c^e
ce,但是快速幂里面的模数n是long long 范围的所以为了防止乘法溢出用一个快速乘来解决乘法溢出问题
#include <bits/stdc++.h>
using namespace std;
long long n=1001733993063167141;
long long d=212353;
long long c=20190324;
long long p=891234941;
long long q=1123984201;
long long e=823816093931522017;
long long phi=(p-1)*(q-1);
void Ex_gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
long long x1,y1;
Ex_gcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
}
long long quickmul(long long a,long long b)
{
long long sum=0;
while(b)
{
if(b%2==1)
sum=(sum+a)%n;
a=(a+a)%n;
b=b/2;
}
return sum;
}
long long quickmod(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b%2==1)
ans=quickmul(ans,a);
a=quickmul(a,a);
b=b/2;
}
return ans;
}
int main()
{
long long x,y;
Ex_gcd(d,(q-1)*(p-1),x,y);
x=(x+phi)%phi;
printf("e=%lld\n",x);
printf("ans=%lld\n",quickmod(c,e));
return 0;
}