#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. Это сработало! Большое спасибо!