简介
自己写脚本搞定这道题有助于理解wiener attack,在多种关于RSA攻击方法中,这种方法算是比较难理解的一种,本题设计还是比较有意思的,算是该攻击方式的一个灵活运用,单纯依靠现成脚本也是不行的,必须学会wiener attack的原理才能顺利解决该问题。
原理阐述
wiener attack 是依靠连分数进行的攻击方式,适用于非常接近某一值(比如1)时,求一个比例关系,通过该比例关系再来反推关键信息就简单很多。这种攻击对于解密指数d很小时有很好的效果,一般的用法是通过
ed mod phi(N)=1
得到 ed=k*phi(N)+1
即 e/phi(N)=k/d+1/phi(N)
这种情况下phi(N)≈N,且phi(N)非常大
所以有 e/N - k/d = 1/phi(N),也就是说k/d与e/N非常接近,而e/N又是已知的
对e/N进行连分数展开,得到的一串分数的分母很有可能就是d(论文太难了,只能记结论了T_T),只要检验一下
ed mod phi(N)
看它是不是1就知道对不对了。
但是这道题倒是告诉我,wiener attack的利用并不一定是这样的方式,只要其他值符合类似的条件,也可以试着求出一个关键值。
另外注意:wiener attack使用是要满足一定数值条件的,对d和N的相对大小,以及p,q的相对大小都是有要求的,用之前可以先大概计算一下是否合适。(LaTaX公式编辑器不会用呀。。就不想把具体公式再打上来了)
题解
分析
先看看题干,明显可以发现加密指数e非常大,有经验就晓得这和wiener attack脱不了干系。
代码的逻辑也很好理解,先是把flag分成两部分(其实两部分加密方式是一样的),然后生成两个非常接近的大素数P1,P2,然后生成了两个相邻的较小的大素数,用P1的平方和Q1相乘得到N1,N2同理。用两个相近巨大的加密指数E加密。
import hashlib
import sympy
from Crypto.Util.number import *
flag = 'GWHT{************}'
flag1 = flag[:19].encode()
flag2 = flag[19:].encode()
assert(len(flag) == 38)
P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)
Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)
N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2
E1 = getPrime(1024)
E2 = sympy.nextprime(E1)
m1 = bytes_to_long(flag1)
m2 = bytes_to_

本文解析RSA加密中的Wiener Attack原理,挑战传统理解,通过实例展示如何在非典型条件下利用连分数求解关键参数。学习如何在N1/N2比例关系中应用Wiener Attack,而非标准指数d情况。
&spm=1001.2101.3001.5002&articleId=117701126&d=1&t=3&u=422e08206d64410281bbdd3edbe1efd5)
1083

被折叠的 条评论
为什么被折叠?



