Python — Как преобразовать строку в целое число для шифрования RSA

#python #encryption #rsa

Вопрос:

Я реализовал простую программу шифрования / дешифрования RSA на Python. Он отлично работает, когда сообщение m является числом. Но если я хочу использовать сообщение типа «привет», как мне преобразовать его, чтобы подключить его к m ** e, который принимает целое число? Его все равно нужно будет отменить для дешифрования. Я пробовал ord() и encode() для создания длинной целочисленной строки чисел ASCII, но тогда я не могу ее отменить.

 m = input("Enter message: ")

# Encryption of m
m = int(m)
c = (m**e) % n
print("Encrypted message = %d" % c)
 

Комментарии:

1. Вам нужна уникальная кодировка и декодирование, а RSA имеет ограничение на шифрование; размер модуля. Преобразуйте строку в байты, а не в interger…

Ответ №1:

Если вы хотите использовать встроенные типы python, вы можете использовать int.from_bytes и int.to_bytes . (Смотрите Документы здесь .)

 import math


def string_to_int(s):
    return int.from_bytes(s.encode(), byteorder='little')


def int_to_string(i):
    length = math.ceil(i.bit_length() / 8)
    return i.to_bytes(length, byteorder='little').decode()


if __name__ == '__main__':
    m = input("Enter message: ")

    m_int = string_to_int(m)
    print(m_int)
    print(int_to_string(m_int))
 

string_to_int Функция просто преобразует в байты, используя str.encode , затем преобразует в int using int.from_bytes .

int_to_string Функция работает аналогично с int.to_bytes and str.decode , хотя ей необходимо знать длину bytes создаваемого объекта. Чтобы вычислить наименьшее количество байтов, в которое поместилось бы целое число, мы используем деление количества используемых битов на 8 и округление в большую сторону — если мы округлим в меньшую сторону, то байтов не хватит для представления числа.

Комментарии:

1. Это сработало! Большое спасибо!