defManger_Attack(c): f1 = 2 whileTrue: val = (pow(f1, e, n) * c) % n if oracle(val): f1 = 2 * f1 else: break f12 = f1 // 2 f2 = ((n + B) // B) * f12 whileTrue: 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