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; }

浙公网安备 33010602011771号