RSA oracle

本文最后更新于:2022年12月29日 下午

Manger’s attack

这种oracle会判断接受到的数字 mm 是否大于一个给定的数字 BB 。如果 mBm \le B 就返回 TrueTrue ,否则返回 FalseFalse , mInteger(n)m \in Integer(n)

Manger’s attack就是利用这个oracle恢复出 mm ,大致思想就是先一次找到 f1,f2f_1,f_2 ,使得f1m[B,2B)f_1\cdot m\in [B,2B)f2m[n,n+B)f_2 \cdot m \in [n,n+B)

这样就给出了 mm 的一个初始范围,mmin=nB,mmax=n+Bf2m_{min}=\lceil\frac{n}{B}\rceil ,m_{max} = \lfloor \frac{n+B}{f_2} \rfloor 。然后再经过一些构造,不断将这个区间二分,从而得到 mm

下面给出oracle和attack的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# https://github.com/rkm0959/rkm0959_implements/tree/main/Manger's_Attack
def oracle(c): # Oracle
global cnt
cnt += 1
ptxt = pow(c, d, n)
if ptxt < B:
return True
else:
return False

def Manger_Attack(c):
f1 = 2
while True:
val = (pow(f1, e, n) * c) % n
if oracle(val):
f1 = 2 * f1
else:
break
f12 = f1 // 2
f2 = ((n + B) // B) * f12
while True:
val = (pow(f2, e, n) * c) % n
if oracle(val):
break
else:
f2 += f12
m_min = (n + f2 - 1) // f2
m_max = (n + B) // f2
# note the ERRATA from https://github.com/GDSSecurity/mangers-oracle
while m_min < m_max:
f_tmp = (2 * B) // (m_max - m_min)
I = (f_tmp * m_min) // n
f3 = (I * n + m_min - 1) // m_min
val = (pow(f3, e, n) * c) % n
if oracle(val):
m_max = (I * n + B) // f3
else:
m_min = (I * n + B + f3 - 1) // f3
return m_min

RSA oracle
https://algellar.github.io/2022/12/27/RSA/RSA oracle/
作者
algellar
发布于
2022年12月27日
许可协议