Как на Python реализовать обратимое XOR-шифрование на основе ограниченного алфавита? Имеется ограниченный алфавит. Допустим, это буквы и цифры. То есть всего 62 символа. В таком случае для шифрования нам достаточно 6 бит.
Есть слово, которое нужно зашифровать и ключ. # Составляем словарь
def form_dict():
alphabet = list(ascii_letters) + list(digits)
return dict([(i, alphabet[i]) for i in range(len(alphabet))])
# Разбираем слово и ключ
def encode_val(word):
d = form_dict()
return [k for c in word for k, v in d.items() if v == c]
# Шифруем слово:
def comparator(value, key):
return dict([(index, list(character))
for index, character in enumerate(zip(value, cycle(key)))])
def full_encode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] ^ v[1]) % l for v in d.values()]
def full_decode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] - v[1]) % l for v in d.values()]
#шифруем
word = 'habrahabrru'
key = 'occaZZion9'
print 'Слово: ' + word
print 'Ключ: ' + key
key_encoded = encode_val(key)
value_encoded = encode_val(word)
encoded_text = full_encode(value_encoded, key_encoded)
#пытаемся расшифровать
decoded = full_decode(encoded_text, key_encoded)
При этом текст отлично шифруется и расшифруется.
Но, если расширить алфавит до 64 символов (добавить, например, точку, запятую и деффис), то на шифрование надо уже 7 бит, и текст начинает шифроваться неправильно, после чего не расшифровывается.
Как реализовать обратимое XOR-шифрование, чтобы зашифрованный текст обязательно состоял из ограниченного алфавита (допустим, 64 символа), а потом поддавался обратной дешифровке?

21 Авг 2019 в 07:14
881 +1
0
Ответы
1

Для реализации обратимого XOR-шифрования на основе ограниченного алфавита с 64 символами, вам необходимо учитывать, что вы работаете с 7 битами вместо 6. Вам нужно будет создать словарь с 64 символами вместо 62.

Вот измененный код для работы с 64 символами в алфавите:

from string import ascii_letters, digits, punctuation
from itertools import cycle
# Составляем словарь
def form_dict():
alphabet = list(ascii_letters) + list(digits) + list(punctuation)
return dict([(i, alphabet[i]) for i in range(len(alphabet))])
# Разбираем слово и ключ
def encode_val(word):
d = form_dict()
return [k for c in word for k, v in d.items() if v == c]
# Шифруем слово:
def comparator(value, key):
return dict([(index, list(character))
for index, character in enumerate(zip(value, cycle(key)))])
def full_encode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] ^ v[1]) % l for v in d.values()]
def full_decode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] - v[1]) % l for v in d.values()]
# Шифруем
word = 'habrahabrru'
key = 'occaZZion9'
print('Слово: ' + word)
print('Ключ: ' + key)
key_encoded = encode_val(key)
value_encoded = encode_val(word)
encoded_text = full_encode(value_encoded, key_encoded)
# Расшифровываем
decoded = full_decode(encoded_text, key_encoded)

Теперь вы можете работать с алфавитом из 64 символов и успешно шифровать и расшифровывать текст.

20 Апр 2024 в 13:05
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир