так что вы уже знаете, что e * d должно соответствовать 1 mod phi (n)
, поскольку вы знаете, что phi (n) кортеж (e, d) может быть рассчитан с использованием расширенного евклидоваАлгоритм (EEA):
выберите целое число для e (обычно небольшое целое число; это будет публичный показатель, шифрование будет быстрее с меньшими показателями), которое меньше phi (n) и больше 2 (? ... я думаю)
когда у вас есть кандидат на e, вычислите наибольший общий делитель (gcd) для e, а phi (n) ... должно быть 1 ... если нет, выберитеновый кандидат для e и repeat (поскольку не было бы никакого модульного обратного, другими словами, для этого e и phi (n) не существует частного показателя d *
после того, как вы знаете, что gcd (e, phi (n)) == 1 вы можете рассчитать d, используя EEA (или в качестве ярлыка, рассчитать EEA напрямую, поскольку он также предоставит GCD ... если это не 1, выберите новое значение для e)
EEA (быстро и грязно для вычисления модульного обратного):
представьте таблицу с 3 столбцами:
Допустим, эти столбцы имеют имена: b, q и t
, поэтому строки этой таблицы будут выглядеть следующим образом:
b0, q0, t0
b1, q1, t1
...
(и т. Д.)
первые 2 строки будут изначально заполнены.для всех остальных строк есть правило итерации, которое можно применить к двум предыдущим строкам, что приведет к значениям для следующей строки
первые 2 строки:
phi (n), NO_VALUE, 0
e, floor (phi (n) / e), 1
итеративное правило для создания следующей строки: (где [] - оператор индекса для выбора строки)
b [i] = b [i-2] mod b [i-1]
q [i] = b [i-1] / b [i] (целочисленное деление, без дробей ...)
t [i] = t [i-2] - (q [i-1] * t [i-1])
вы можете прервать схему, когда b [i] становится равным 0или 1 ... вам не нужно q для последней строки ...
, поэтому, если b [i] равно 0, b [i-1] не может быть 1, так как вы должны были прерваться, когдаВы вычислили b [i-1], если это было 1 ...
, если вы достигли b [i] == 0, b [i-1] - это ваш gcd ..., так как это не 1 вынужно новое значение для e
, если b [i] == 1 ваш gcd равен 1, и есть обратное значение ... и это t [i] (если t отрицательно, добавьте phi (n))
пример с реальными значениями:
давайтескажем, phi (n) равно 120, скажем, мы выбираем 23 в качестве кандидата на e
наша таблица будет выглядеть так:
b q t
120 – 0
23 5 1
5 4 -5
3 1 21
2 1 -26
1 2 47
последний вычисленный b равен 1, так что => gcd (23 120) == 1 (доказательство: обратное существует)
последнее вычисленное t равно 47 => 23 * 47 mod 120 == 1 (t является обратным)