Как на 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
856 +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 Апр в 13:05
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир