这个题应该是填空题中最难的一个了。
思路很简单,但是你需要一点python的基础
讲一下本题的思路。
首先我们要对公钥中的n进行质因子分解,得到p,q。然后根据 d * e %((p - 1) * (q - 1) == 1和扩展欧几里得
求出e。
RSA是一种不可逆的加密方法,不可逆的原因是公钥特别大,对它分解质因子时间上会很长,普通计算机大概是
10年左右,量子计算机一星期就可以了,基本不可能在常数时间分解出来;
本题能做的原因是公钥n特别小(在RSA中,1e18已经算特别小)
1.首先我们要对n进行分解质因数
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define mmset(a,b) memset(a,b,sizeof(a))
#define UI64d unsigned __int64
UI64d FastPower(UI64d a , UI64d k);
UI64d MOD = 1001733993063167141;
int main()
{
UI64d res = 1001733993063167141;
for(int i= 2; i * i < res; i++)
{
while(res % i == 0 && res != 1)
{
printf("%I64d %I64d\n",i,res / i);
res /= i;
}
}
return 0;
}
可得p = 891234941, q = 1123984201;
2.求解e
令 sum = (p-1) * (q-1) = 1001733991047948000;
那么可得d * e % sum == 1, 这是一个典型的求解ax=c(mod b)问题。
也就是e*d =1(mod sum),我们可以用扩展欧几里得算法来求解
为防止溢出,我用的是python写的
def computeD(fn, d):
(x, y, r) = exGCD(fn, d)
if y < 0:
return fn + y
return y
def exGCD(a, b):
if b == 0:
return (1, 0, a)
x1 = 1
y1 = 0
x2 = 0
y2 = 1
while b != 0:
q = a / b
r = a % b
a = b
b = r
x = x1 - q*x2
x1 = x2
x2 = x
y = y1 - q*y2
y1 = y2
y2 = y
return(x1, y1, a)
p = 891234941
q = 1123984201
d = 212353
sum = (p - 1) * (q - 1)
e = computeD(sum, d)
print e
e = 823816093931522017;
3.已知C,e,n,求解X = C^e mod n
X是原文。
这一步思路很简单,快速幂就行了,但是我用c++写溢出了,只能用python
MOD = 1001733993063167141
def FastPower(a,k):
res = a
ans = 1
while k != 0:
if (k % 2) != 0:
ans = (ans % MOD) * (res % MOD) % MOD
res = (res % MOD) * (res % MOD) % MOD
k = k / 2
return ans
a = 20190324
k = 823816093931522017
res = FastPower(a1,k1)
print(res)
最终答案为579706994112328949。
我们可以把这个明文带去求密文的过程验证一下看写的对不对
得到密文20190320与题目一致,说明我们没写错