2019-E(RSA解密)

注意快速乘法,快速幂,扩展欧几里得求逆元的模板

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//d*e≡1(mod m)  d*e = k*m+1
// d m x y
//求解e e = (x%m +m)%m; 
void Exgcd(ll a,ll b,ll &x,ll &y){//利用扩展欧几里得求逆元
    if(!b) x=1,y=0;
    else Exgcd(b,a%b,y,x),y -=a/b*x; 
}

//快速乘法O(1)
inline ll mul(ll x ,ll y ,ll p){//防止ll和ll乘,然后modll爆出
    ll z = (long double)x/p*y;
    ll res = (unsigned long long)x*y - (unsigned long long )z*p;//感觉向下取整,产生一个差值 
    return (res+p)%p; 
}

//快速幂
ll fpm(ll x,ll power,ll p){
    x%=p;
    ll ans=1;
    for(;power;power >>=1,x = mul(x,x,p))//按位处理,分成按位累乘 
       if(power & 1)(ans = mul(ans,x,p)) %=p;
    return ans;
} 
int main(){
    ll n = 1001733993063167141, d = 212353, p, q;
    for(ll i=3;i*i<n;i+=2){
        //暴力枚举质因数,第一个枚举到的因数一定是质因数,如果不是质数的话,那么他前面一定还能再枚举出一个质因数 
        if(n%i == 0){
            p=i;
            q=n/i;
            break;
        }
    }
    cout << "p = " << p << endl;
    cout << "q = " << q << endl;
    
    ll e,m = (p-1)*(q-1),x,y;
    Exgcd(d, m, x, y);
    e = (x%m+m)%m;
    ll C = 20190324;
    cout<<"e:"<<e<<endl;
    cout << fpm(C, e, n) << endl;//解密,输出结果 
    return 0;
}

 

posted @ 2021-03-08 15:23  zmachine  阅读(94)  评论(0)    收藏  举报