感觉有趣,便记录下来,应该会逐步更新,先写一个getflag2先(3月27已更新完),后续考虑录一个视频讲解,但也是后话。
getflag2
题目代码块
1 | def getflag2(m): |
官方给出的WP
分析
首先说一下用到的数学原理——费马小定理或者欧拉定理,以及中国剩余定理的思路。
已知
hint1≡mpmodn……①hint2≡mqmodn……②n,e,c具体值接下来我们分析一下由哪些地方可以让我们获得到p或者q(rsa大部分解法)
- 先入为主的肯定是m头上那诱惑的p,导致主播想用离散对数来求解,冷静下来的主播想起p的位数是512位,此方案不通。
- 其次是模数中的n,可以降为k⋅p (具体原因如下[1]),而且给出了两个式子,可以尝试寻找之间的联系,我们从这里入手。
由①式得
hint1=mp+k⋅n #将n分解,并两边同时模上p≡mp+k⋅p⋅qmodp≡mmodp=m+k⋅p怎么让这个结果与②式有联系呢,我们观察①②差别,幂不同,一个是p,一个是q,那么n可以联系两个式子。
hint1n≡mp⋅p⋅qmodp #由模的性质可以得出≡((mp %p )p %p )qmodp而mp %p=m,套两层p,得出的结果也是m
得出
hint1n≡mqmodp=mq+k⋅p此时,怎么解出p已经不言而喻了。
hint1n=mq+k1⋅p……③hint2≡mq+k2⋅p……④③-④得k⋅p,与n求最大公因数,即可得到p。
getflag1
题目代码块
1 | def getflag1(m): |
官方解法
分析
已有
hint≡(2024⋅p+2025)qmodnn,e,c具体值见到括号,先拆括号
hint=C0q⋅(2024⋅p)q+C1q⋅(2024⋅p)q−1⋅2025+......+Cq−1q⋅(2024⋅p)1⋅2025q−1+Cqq⋅2025q+k⋅p⋅q观察一下,我们可以从哪里获取到p或者q
- 多项式系数中含有q
- 2024⋅p
- 2025的幂q
- k⋅p⋅q中
多项式系数:注意最后倒数第二项,会生成一个n出来,2024⋅n⋅2025q−1,但这个对这题没有帮助
2024⋅p太多了。
2025降幂太大了。
这个式子太多p了,让我们简化一下,将单个p提取出来,得到
hint=2025q+k⋅p……①也可以理解成先取模p,然后再展开
hint≡2025qmodphint=2025q+k⋅p那么我们现在要剔除2025q,用费马小定理构造一个
2025n≡2025p⋅qmodn#将模数降为p2025n≡2025p⋅qmodp≡(2025p %p)qmodp #费马小定理≡2025qmodp即2025n=2025q+k⋅p
整体是在n下运行的,那么我们再模上n来加快计算速度
最终我们运用的算式为
2025n≡2025q+k⋅pmodn……②综上
hint=2025q+k⋅p……①2025n≡2025q+k⋅pmodn……②①-②得
hint−2025n≡(k1−k2)⋅pmodn=(k1−k2)⋅p+k3⋅p⋅q=K⋅p其中K=k1−k2+k3⋅q
求K⋅p与n最大公因数即可得到p
getflag3
题目代码
1 | def getflag3(m): |
官方解法
分析
已知
hint=(20242025+p⋅1111)emodn已知n,e,c拆开括号
hint=C0e⋅(20242025)e+C1e⋅(20242025)e−1⋅(p⋅1111)+......+Ce−1e⋅(20242025)1⋅(p⋅1111)e−1+Cee⋅(p⋅1111)q+k⋅p⋅q化简一下p的系数
hint=k⋅p+20242025e这好办了,我们已知20242025与e
那么有
k⋅p=hint−20242025e为了加快计算,我们也是统一模上n
最终我们有
k⋅p≡hint−20242025emodn求k⋅p与n的最大公因数,得到p
[1]降模:笔者自己的叫法,
n=p⋅qa≡bmodna=b+k⋅n#两边同时模上pa≡b+k⋅p⋅qmodpa≡bmodp