2017-01-11 1 views
1

Канонический ответ на этот вопрос - «использовать расширенный алгоритм евклидова», однако он использует операции деления и умножения, которые являются болью для реализации очень больших чисел на ПЛИС. Я хотел бы использовать его в генерации ключей RSA.Как найти модульный мультипликативный инверсный номер без использования деления для fpga?

+1

Вы уверены, что там _is_ менее болезненным способом? Ожидается, что генерация ключа RSA будет дорогостоящей. – duskwuff

+0

Вы также можете изучить модульное умножение Монтгомери. –

+0

Я думаю, я не могу использовать его, поскольку модуль должен быть нечетным и. –

ответ

2

Я рекомендую binary euclidean algorithm

заменяет деление арифметических сдвигов, сравнение и вычитание

Удлиненных двоичный НОД, аналогично расширенным алгоритм Евклида, задается Кнутом вместе с указателями на другой версии.

Я нашел реализацию Python бинарного расширенный алгоритм Евклида here:

def strip_powers_of_two(c, p, q, gamma, delta): 
    c = c/2 
    if (p % 2 == 0) and (q % 2 == 0): 
     p, q = p//2, q//2 
    else: 
     p, q = (p + delta)//2, (q - gamma)//2 
    return c, p, q 

def ext_bin_gcd(a,b): 
    u, v, s, t, r = 1, 0, 0, 1, 0 
    while (a % 2 == 0) and (b % 2 == 0): 
     a, b, r = a//2, b//2, r+1 
    alpha, beta = a, b 
    while (a % 2 == 0): 
     a, u, v = strip_powers_of_two(a, u, v, alpha, beta) 
    while a != b: 
     if (b % 2 == 0): 
      b, s, t = strip_powers_of_two(b, s, t, alpha, beta) 
     elif b < a: 
      a, b, u, v, s, t = b, a, s, t, u, v 
     else: 
      b, s, t = b - a, s - u, t - v 
    return (2 ** r) * a, s, t 
2

Предоставлено n, пусть Φ(n) будет числом целых чисел менее n и относительно простым с ним.

От https://en.wikipedia.org/wiki/Euler%27s_theorem, если m взаимно простое с n то m^(Φ(n)-1) мультипликативная инверсия m. Это можно вычислить с помощью умножения O(log(n)).

+2

Существует одна проблема с этим решением. Он требует вычисления 'm^(phi (n) -1)' modulo MOD, так что он включает в себя поиск остатка и использование деления. – kraskevich

+0

Хороший ответ для прецедента - обычно применяется только для постоянных модулей, где вы можете прекомпопировать Φ (n), но поскольку это для генерации ключей RSA, Φ (n) можно легко вычислить из коэффициентов n, которые являются известен. –

+0

@kraskevich Вы правы. – btilly

Смежные вопросы