Почему не работает шифрование и дешифрование RSA
Я закодировал функции дешифрования и шифрования RSA, например:
def encrypt(m,e,n):
return pow(int(m.encode('hex'), 16), int(e, 10), int(n, 10) )
def decrypt(c,d,n):
p = pow(int(c, 10), int(d, 10), int(n, 10))
return hex(p)[2:].decode('hex')
Когда я хочу использовать эти функции, как следующие, все в порядке
e = "65537"
n = "21856687"
d = "12096993"
m = "TH"
c = encrypt(m,e,n)
print decrypt(str(c),d,n)
Но когда я изменяю сообщение на зашифрованное (в данном случае m), я получаю неправильный ответ, на самом деле они кажутся мусорным значением. Под изменением сообщения я подразумеваю попытку сообщения длиной более 2, как показано ниже.
e = "65537"
n = "21856687"
d = "12096993"
m = "THIS IS A HIDDEN MESSAGE"
c = encrypt(m,e,n)
print decrypt(str(c),d,n)
1 ответ
Байты сообщения, интерпретируемые как число Big Endian, должны быть меньше n
для этого туда и обратно. Вам нужно будет провернуть p
а также q
или уменьшите ваше сообщение. (Ваш "мусор" является эквивалентным сообщением по модулю n, он должен просто туда-обратно)
И хотя мы надеемся, что это домашнее задание, я чувствую себя обязанным констатировать, что необработанный (unpadded) RSA - плохая идея, а DIY RSA - плохая идея. Первый подвержен различным атакам на данные, а второй, вероятно, имеет временные уязвимости, ведущие к компрометации закрытого ключа.