还得是数论大佬 Ver 1.0 & 爆破RSA闪耀时刻有感
还得是 CTF 大佬。
这题好像没什么人 A,难度确实配得上紫题。概括题意:你将获得
观察下载的数据后会发现有些数据大得令人发指。所以除非利用几千行的高精来手写所有基本运算(甚至包括高精度开根),否则请使用 Python。况且,在运行效率上也是 Python 快。
然后我们理解了 RSA 的加密法则后即可开始破译。
:::success[一种投机取巧的方法]{open}
出题人大概觉得,它的数据可以克掉普通的质因数分解器与数据库。那是确实,因为数据普遍有
但 factordb 或者 yafu 比出题人的数据还强大。本题所有数据均可使用它们分解出准确数。因此我们可以用一份程序通过所有数据,只需手动把分解结果粘贴进代码即可。
当然,还是学习特定技巧为重。
:::
Case 1
数据很小,暴力分解即可。使用大数分解器等方法这里就不提了。
至于解码部分,当然是写程序解码更快。提供一份示例程序:(注意要安装并引用 Crypto 库)
def extract_flag(m):
try:
flag = long_to_bytes(m).decode('utf-8')
if '{' in flag and '}' in flag:
return flag[flag.find('{')+1 : flag.find('}')]
return flag
except UnicodeDecodeError:
hex_str = hex(m)[2:]
# 处理非 ASCII 字节(如填充、Base64)
if len(hex_str) % 2 != 0:
hex_str = '0' + hex_str # 对齐字节
bytes_data = bytes.fromhex(hex_str)
return f"Hex: {hex_str}, Bytes: {bytes_data}"
解码结果说 Very Simple RSA。这是签到。
Case 2
数据已上升至
显然地,用 Pollard-Rho 或者维纳攻击(Wiener's Attack) 就可以快速分解出答案。Pollard-Rho 可以参考我这篇文章的实现和优化方式;维纳攻击是一种专门爆破 RSA 的方法,依靠连分数展开破解,能处理的数据范围比 Pollard-Rho 大得多,代码也不是很难实现。这题用 Pollard-Rho 就可以满足需求了。
分解得
解码结果说 Pollard-Rho is OK。看来 Pollard-Rho 确实是正解。
Case 3
第一眼:
考虑费马分解(Fermat's Factorization)。费马分解用于处理
然后你会发现你爆破失败了。为什么?因为大数开根会有精度误差,需安装并使用 gmpy2 库这个高精度大数处理库。里面的 isqrt() 函数可以精确分解。
结果:Fermat is Awesome。
Case 4
本题有两组数据。然后我们发现特殊性质说
最大公约数攻击,通过计算共同的 gcd() 函数。
可能有人会问:两组数据应当有两个密文但是只有一个答案?解密得一个说 GCD Solves This Quiz,一个说 USELESSSSSSSSSSSSSSSSSSSSSSSSSSShahahah。嗯。
Case 5
数据又变小了?特殊性质说
这就是低加密指数攻击,又称小指数明文爆破攻击(Low-Exponent Attack)。那么考虑一下:如果
注意开方千万不要直接 c**(1/3)。
结果:
Case 6
两组数据,
毒瘤的出题人并没有写出这一点。要靠大力肉眼观察。
既然模数相同那就使用共模攻击(Common Modulus Attack)。因为
因为明文
Case 7
数据很吓人,因为有三组。虽然
然后我们发现它们共用
没错,这便是广播攻击(Håstad's Broadcast Attack)。它基于 CRT 实现解同余方程组来破解 RSA。套一个板子进去就好了。
注意:这里的取最大公约数不能用 math 的。会爆。不过 gmpy2 里刚好有一个。
Three Times is Also Weak。确实。
Case 8
多了一个
这个只需八年级水平和注意力。所以:Attention is All You Need。
Case 9
最后一个是尾杀吗?不是。
感谢您的游玩。Thanks For Your Playing。
总结:这题挺有难度的,OI选手我想都做不出来吧。赛场上能切的一定是 CTF 大佬或者去网上搜过 RSA 破解方法的选手。
至于实现,我觉得这里的就讲得很好了。大家可以参考一下。