Предположим, что e мало (это обычный случай; традиционный открытый показатель равен 65537). Давайте также предположим, что ed = 1 mod phi (n) , где phi (n) = (p-1) (q-1) (это не обязательно так: требования RSA состоят в том, что ed = 1 mod lcm (p-1, q-1) и phi (n) является только кратный lcm (p-1, q-1) ).
Теперь у вас есть ed = k * phi (n) + 1 для некоторого целого числа k . Так как d меньше, чем фи (n) , вы знаете, что k . Таким образом, у вас есть только небольшое количество k , чтобы попробовать. На самом деле, phi (n) близко к n (разница составляет порядка sqrt (n) ; другими словами, при записи в битах верхняя половина phi (n) идентична верхней части n ), поэтому вы можете вычислить k ' с помощью: k' = round ( ред / п) . k ' очень близко к k (то есть | k'-k | <= 1 </em>) до размера e не более половины размера n .
Учитывая k , вы легко получаете phi (n) = (ed-1) / k . Так получилось, что:
phi (n) = (p-1) (q-1) = pq - (p + q) + 1 = n + 1 - (p + q)
Таким образом, вы получите p + q = n + 1 - фи (n) . У вас также есть pq . Пришло время вспомнить, что для всех действительных чисел a и b , a и b являются двумя решениями квадратного уравнения * 1 079 * Х 2 - (а + б) Х + абы * * тысяча восемьдесят-два. Итак, данные p + q и pq , p и q получены путем решения квадратного уравнения:
p = ((p + q) + sqrt ((p + q) 2 - 4 * pq)) / 2
q = ((p + q) - sqrt ((p + q) 2 - 4 * pq)) / 2
В общем случае e и d могут иметь произвольные размеры (возможно, больше, чем n ), потому что все, что нужно RSA, - это ed = 1 mod (p-1) и ed = 1 mod (q-1) . Существует универсальный (и быстрый) метод, который немного похож на тест первичности Миллера-Рабина. Это описано в Справочнике по прикладной криптографии (глава 8, раздел 8.2.2, стр. 287). Этот метод концептуально немного сложнее (он требует модульного возведения в степень), но его может быть проще реализовать (поскольку квадратного корня нет).