отрицательная экспонента в модульном возведении в степень для RSA

Я пытаюсь написать код RSA на python3.6 в образовательных целях.

Генерация ключей и шифрование сообщений работают нормально, но у меня проблема с расшифровкой. Насколько я понимаю, алгоритм дешифрования M = C d mod n, где M - сообщение, C - зашифрованное сообщение (с использованием открытого ключа получателя), d - закрытый ключ получателя. . Проблема в том, когда d отрицательно, что, по моему опыту, бывает очень часто. Я использую алгоритм с написанием справа налево для модульного возведения в степень, но я не знаю, как заставить его работать с отрицательной экспонентой. Вот мой код для m. е .:

def mod_pow(b, e, m):
if m == 1:
    return 0
res = 1
b = b % m
while e > 0:
    if e % 2 == 1:
        res = (res * b) % m
    e = e >> 1
    b = (b * b) % m
return res

person Ivan Gorin    schedule 13.06.2017    source источник
comment
d не должно быть отрицательным. Если это так, то вы делаете это неправильно.   -  person President James K. Polk    schedule 13.06.2017
comment
См. Вычисление модульных инверсий: если t ‹0, то t: = t + n. Вот почему d всегда будет положительным для правильного модульного обратного алгоритма.   -  person President James K. Polk    schedule 13.06.2017
comment
Спасибо! Теперь это наконец-то работает!   -  person Ivan Gorin    schedule 13.06.2017


Ответы (1)


На вопрос ответил Джеймс К. Полк, мне просто нужно было добавить это в расширенный код алгоритма Евклида:

if t < 0:
    t += n
person Ivan Gorin    schedule 13.06.2017