Как на 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 символа), а потом поддавался обратной дешифровке?
Для реализации обратимого 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 символов и успешно шифровать и расшифровывать текст.
Для реализации обратимого XOR-шифрования на основе ограниченного алфавита с 64 символами, вам необходимо учитывать, что вы работаете с 7 битами вместо 6. Вам нужно будет создать словарь с 64 символами вместо 62.
Вот измененный код для работы с 64 символами в алфавите:
from string import ascii_letters, digits, punctuationfrom 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 символов и успешно шифровать и расшифровывать текст.