Всем хаброчитатилям привет, для начала расскажу что из себя представляет алгоритм "маской" (название придумал я).
И да, как можно прочитать в названии нам нужно сгенерировать маску чтобы потом её на что-то наложить. Вот так легко она генерируется:
# code n1
from random import shuffle
password = 'пароль'
data = ['какие-небудь данные']
mask = list(range(len(data)))
seed(password)
shuffle(mask)
Мой код может быть не идеален
Теперь давайте определимся что мы в принципе и будем шифровать
Мой выбор пал на байты, так как в них легко превратить почти всё в Python
А теперь давайте напишем сам алгоритм наложения маски!
Алгоритм кодирования:
#code n2
result = [0] * len(data)
for d in range(len(data)):
result[mask[d]] = data[d]
print(result)
А вот и алгоритм расшифровки:
#code n3
for d in mask:
result.append(data[d])
print(result)
Да, всё так просто
НО! Теперь давайте представим что мы просто зашифровали b'hello' и у нас получилось b'oelhl', даже человек простым подбором может прочитать это.
Поэтому нужно во что-то превратить эти байты чтобы они после шифровки небыли читабельными
Я выбрал превращать байты в биты и эти биты уже и шифровать
Вот код превращения из байтов в биты:
#code n4
result = []
for b in _bytes:
result.extend(map(int, f'{b:08b}'))
print(result)
А вот код обратного превращения:
#code n5
result = bytes(int(''.join(str(bit) for bit in bits), 2) for bits in [self.data[i:i + 8] for i in range(0, len(self.data), 8)])
print(result)
# Извините, если всё написал в одной строке и это не читабельно
А вот теперь и можно использовать этот алгоритм на практике. Давайте что-нибудь зашифруем!
password = 'привет'
data = b'hello'
mask = createMask(password) # создаём маску (code n1)
bits_data = toBits(data) # превращаем байты в биты (code n4)
enc_data = encode(data, mask) # кодируем алгиритмом "маски" (code n2)
bytes_enc_data = toBytes(enc_data) # расшифровывем биты в байты (code n5)
print(bytes_enc_data)
b'\xdb6T,^'
Круто, да! Мы получили полностью не читабельный рузультат, зашифрованный паролем!
Ну и также этот результат можно расшифровать:
bits_enc_data = toBits(bytes_enc_data) # превращаем шифрованый результат обратно в биты (code n4)
dec_bits = decode(bits_enc_data, mask) # расшифровывем биты (code n3)
bytes_dec_data = toBytes(dec_bits) # превращаем биты в байты (code n5)
print(dec_result)
b'hello'
И да, я сделал модуль на python
Исходный код модуля можно найти на
[https://github.com/michazaxm/shifrator]
И проект на pypi:
[https://pypi/project/enc-shifrator]