RSA parity oracle例题复现
最近在比赛中碰到了RSA parity oracle攻击的题目,当时对这个攻击没有什么印象,赛后看wp复现了一遍,这里稍微总结一下。
[CTFshow七夕杯] 优势在我
题目源码如下:
1 | from Crypto.Util.number import * |
乍一看r和s,以为是一道DSA,其实半毛钱关系没有。题目中能对任意密文解密,并输出解密后明文m对应的r和s,其中有动态随机数k参与运算,我们很难构造r,s和m之间的关系来反推出m,正向分解N来破解RSA也不可能。
这里就是本题关键所在了,我们需要通过r和s来分析得到对应m的奇偶性,然后运用RSA
parity oracle的思想来求出m。首先简单说一下RSA parity
oracle攻击的思路。这一攻击的前提是需要能够进行任意密文的解密,并能得到解密明文的奇偶性,即对于任意c,能够知道
对于所求明文m,我们可以构造c来求出
解题脚本如下:
1 | import random |
这里直接用gmpy里的legendre,sage里的legendre_symbol跑起来有点慢。
总结一下RSA parity oracle攻击的条件就是:需要能够任意密文的解密,并能得到明文的奇偶性。满足这一条件就可以考虑采用这种思想了。
在corctf貌似看到了该手法的变种,等赛后有了wp再来复现一波~
补充复现:
[corCTF 2022] generous
题目源码如下:
1 | #!/usr/local/bin/python |
这题仍然是有一个明显的parity oracle,只不过加密系统不再是RSA。注意到这里公钥加密是模n的,而私钥解密出的m则是模p的。由于p是未知的,因此我们无法像之前一样设置上下界来准确地二分求出m。但是,此题我们可以换一个思路,利用parity oracle去求p。原理同前一题类似:
我们知道p是小于
求出p之后就能算出私钥,然后直接解密即可。
解题脚本如下:
1 | from random import randrange |
RSA parity oracle例题复现