Почему не работает шифрование и дешифрование 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 - плохая идея. Первый подвержен различным атакам на данные, а второй, вероятно, имеет временные уязвимости, ведущие к компрометации закрытого ключа.

Другие вопросы по тегам