Как стать автором
Обновить

Мой алгоритм шифрования «маской» на Python

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров4.3K

Всем хаброчитатилям привет, для начала расскажу что из себя представляет алгоритм "маской" (название придумал я).

И да, как можно прочитать в названии нам нужно сгенерировать маску чтобы потом её на что-то наложить. Вот так легко она генерируется:

# 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]

Теги:
Хабы:
Всего голосов 19: ↑3 и ↓16-12
Комментарии8

Публикации

Истории

Работа

Python разработчик
110 вакансий
Data Scientist
63 вакансии

Ближайшие события

Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
OTUS CONF: GameDev
Дата30 мая
Время19:00 – 20:30
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область