rsa解密

#include <iostream>
#include <algorithm>
#define MOD 233493331

using namespace std;
//快速幂乘,用二分法将幂次较大的数用2分的思想相乘
//模的乘积等于乘积的模,数学定理
typedef long long ll;
ll qpow(ll a, ll n) {
if (n == 0)
return 1;
else if (n % 2 == 1)
return qpow(a, n - 1) * a % MOD;
else {
ll temp = qpow(a, n / 2) % MOD;
return temp * temp % MOD;
}
}
//欧几里得算法用来求两数最小公约数,当两数互为素数则最小公约数gcd(a,b)==1
//int gcd(int a, int b)
//{
// if (b == 0)
// return a;
// else
// {
// return gcd(b, a%b);
// }
//}
//拓展欧几里得算法在欧几里得算法的基础上求 ax+by=1,中x和y的值,这里的x可以作为rsa中的解密密钥,a作为加密密钥
//由取模运算的原理 a%b=a-(a/b)*b,若已知第二个状态的特解x0,y0,反推出第一个状态的两个解
//b*x1 + (a - (a / b)*b)*y1
//= b * x1 + a * y1 –(a / b)*b*y1
//= a * y1 + b * (x1 – a / b * y1) = gcd 发现 x = y1, y = x1 – a / b * y1
//这样可以递归逆推求得特解x,y
int ex_gcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}

int ans = ex_gcd(b, a % b, x, y);
int temp = y;
y = x - (a / b) * y;
x = temp;
return ans;

}
//逆元:ax mod(m)=1,我们称 x 是 a 关于 m 的乘法逆元 等价于表达式a*x + m*y = 1
//当a与m互素的时候,可以求出特解x0,进而求出通解x=x0+m*t,逆元与m同余,一定存在一个最小的正整数,它是 a 关于m 的逆元,而最小的肯定是在(0 , m)之间的(设m>0)
//则当x小于0时,加上m即可求得逆元
int main() {
int e, c;
cin >> e >> c;
int x, y;
long long n = 23333 * 10007;
long long phi = 23332 * 10006;
int r = ex_gcd(e, phi, x, y);
x *= 1 / r;
phi = abs(phi);
int ans = x % phi;
if (ans < 0) {
ans += phi;
}
int m = qpow(c, ans);
cout << m;
return 0;
}

posted @ 2021-09-25 15:14  huhuf6  阅读(230)  评论(0编辑  收藏  举报