互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数

思路:现在的要求是解密,所以按照公式,现在还差e,那么要求e就需要求p,q,根据公式(d*e)%(p-1)(q-1)=1可以知道p,q。
**注意,因为p,q是两个质数,所以他们的公因数只有1,所以n【n=p*q】只有这2个因子,没有别的因子了,所以就可以用暴力法,所以方法是:
循环i从2~根号n,若n%i==0,则证明i该i是p或q,n/i则是另一个数,就找到了p和q了!!
**
#include<iostream>
#include<cmath>
#define ll long long
//定义一个数据类型为long long
using namespace std;
int main()
{
ll n=1001733993063167141;
ll k=sqrt(n);
for(ll i=2;i<k;i++)
{
if(n%i==0)
{
cout<<i<<' '<<n/i<<endl;
}
}
return 0;
}
//891234941 1123984201[p和q的值]
n = 1001733993063167141
d = 212353
p=891234941
q=1123984201
//接下来求e,,这时候要用到真正的大数了。c++的64位long long不够用,虽然有_int128,但是有些编译器不支持。
还是靠Python吧。下面代码打印出e=823816093931522017。注意e有很多个,取最小的一个就行了。
tmp = (p - 1) * (q - 1)
print(tmp)
for i in range(2,n+1):
now = i * tmp + 1
if (now % d == 0):
print(now // d) #打印e
break #有很多e,求第一个就行了
** 求= X = C^e mod n
这是快速幂的知识点:
e是C的指数
e&1:指的是取e的最后一位并判断是否为1,是否需要跳过
e>>=1:指的是把e的二进制右移一位,目的是把刚才判断过的最后一位除掉
已知:
(ab)%m=(a%m)(b%m)
通过转换,可得:
(ax)%m
=(a×a×a×…×a(共x个a相乘))%m
=(a%m)×(a×a×a×…×a(共x−1个a相乘))%m
=((a%m)×(a%m))×(a×a×a×…×a(共x−2个a相乘))%m
…
例如:
C^11% p=(C1*C2C8)%p=(C1%p)(C2%p)*(C8%p)
**
def qpow(c,e,n):
ret = 1
while e:
if(e&1):
ret = ret*c % n
c = c*c % n
e>>=1
return ret
n = 1001733993063167141
e = 823816093931522017 #试试其他的e
C = 20190324
print(qpow(C,e,n)) #579706994112328949

下面是快速幂,和快速幂求模的模板
//快速幂求模
#include<iostream>
#define ll long long
using namespace std;
ll pow_mod(ll a,ll b,ll p)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=ans*a%p;
}
a=a*a%p;
b>>=1;
}
return ans;
}
int main()
{
ll a,b,p;
cin>>a>>b>>p;
cout<<pow_mod(a,b,p)<<endl;;
return 0;
}
//快速幂:求a^b
#include<iostream>
#define ll long long
using namespace std;
ll pow_mod(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=ans*a;
}
a=a*a;
b>>=1;
}
return ans;
}
int main()
{
ll a,b;
cin>>a>>b;
cout<<pow_mod(a,b)<<endl;;
return 0;
}
快速幂,求A^B最后三位数表示的整数
long long fastPower(long long base, long long power)
{
long long result = 1;
while (power > 0)
{
if (power & 1)
{
result = result * base % 1000;
}
power >>= 1;
base = (base * base) % 1000;
}
return result;
}
本文介绍了RSA加密中的质因数分解和快速幂算法。首先通过质因数分解找到大数的两个质数因子p和q,然后利用(e*d)%(p-1)*(q-1)=1求解e。接着,使用快速幂算法计算C^e模n的结果,实现解密过程。示例中详细展示了如何运用这些算法解决具体问题。
1340

被折叠的 条评论
为什么被折叠?



