Расшифровка RSA
-
29-09-2020 - |
Вопрос
Как мы можем расшифровать сообщение RSA, если у нас есть только открытый ключ?
Например, сообщение:21556870,12228498
Открытый ключ: (e = 15852553, n = 44331583)
Я знаю, что существуют такие формулы:
gcd(e, φ(n)) = 1
ed mod φ(n) = 1
поэтому моя идея заключалась в том, что я мог бы поместить значение e в первую формулу, а затем получить d, которое является частью закрытого ключа.Однако я не думаю, что математически возможно найти φ(n)
здесь.Итак, как еще я могу расшифровать сообщение RSA, используя только открытый ключ?
Решение
«Как мы можем расшифровать сообщение RSA, если у нас есть только открытый ключ?»
Хорошо, нам нужно найти закрытый ключ из открытого ключа.В целом это должно быть слишком сложно сделать в практических ситуациях, поскольку алгоритмы RSA — это проверенные временем алгоритмы безопасности, проверенные в полевых условиях, и люди в целом используют их осторожно с достаточно длинными битами.
Однако назначенное вам упражнение предназначено для отработки алгоритма RSA.Используемые числа недостаточно велики, чтобы помешать вам получить закрытый ключ с учетом открытого ключа. Вы должны уметь выполнять все вычисления с помощью простого программирования, используя свой любимый язык программирования и компьютер.
Попробуйте больше, прежде чем смотреть на ответ ниже.
Открытый ключ: (e = 15852553, n = 44331583)
Давайте фактор n
.Вот простая программа на Python.
def factor(n):
for i in range(2, n-1):
if n % i == 0:
print(str(n) + " = " + str(i) + " * " + str(n // i))
break
Бег factor(44331583)
, мы получаем, что 44331583 = 5003 * 8861
.
Так φ(n) = (5003 - 1) * (8861 - 1) = 44317720
Найдите обратную величину e
по модулю φ(n)
.Вот простая программа на Python.
def inverse(e, phi):
""" display the inverse of e modulo phi """
for i in range(1, phi):
if i * e % phi == 1:
print(str(e) + " * " + str(i) + " = 1 (mod " + str(phi) + ")")
break
Бег inverse(15852553, 44317720)
, мы получаем, что 15852553 * 1951097 = 1 (mod 44317720)
.То есть, обратное e
по модулю φ(n)
является d=1951097
.
Итак, соответствующий закрытый ключ (d = 1951097, n = 44331583)
.
Вычислить m**d (mod n)
для расшифровки сообщения RSA (также известного какзашифрованный текст) m
.Вот популярная функция модульного возведения в степень.
def modulo_pow(base, exponent, modulus):
""" display the result of base ** exponent % modulus """
exp = exponent
result = 1
b = base % modulus
while exp > 0:
if exp % 2 == 1:
result = (result * b) % modulus
exp = exp >> 1
b = (b * b) % modulus
print(str(base) + " ** " + str(exponent)
+ " = " + str(result) + " (mod " + str(modulus) + ")")
Бег modulo_pow(21556870, 1951097, 44331583)
и modulo_pow(71, 15852553, 44331583)
, мы получили соответственно
21556870 ** 1951097 = 71 (mod 44331583)
12228498 ** 1951097 = 111 (mod 44331583)
Следовательно, расшифрованное сообщение 71,111
.Сможете ли вы найти, что это значит?
Другие советы
Вам нужно будет учитывать основу открытого ключа RSA, чтобы быть в состоянии расшифровать.То есть весь смысл: растрескивание RSA эквивалентно факторингу, а факторинг (предполагается быть) очень жестким.