Всем хаброчитатилям привет, для начала расскажу что из себя представляет алгоритм «маской» (название придумал я).
И да, как можно прочитать в названии нам нужно сгенерировать маску чтобы потом её на что-то наложить. Вот так легко она генерируется:
# 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]
ссылка на оригинал статьи https://habr.com/ru/post/718364/
Добавить комментарий