Шаг 10.
Задачи ComputerScience на Python. Простые задачи. Невскрываемое шифрование. Получение данных в заданной последовательности

    На этом шаге мы рассмотрим, как можно выполнить указанную операцию.

    В этом примере мы зашифруем строку str, используя одноразовый шифр. Один из способов представления типа str в Python 3 - это последовательность байтов UTF-8 (UTF-8 - это кодировка символов Unicode). Тип str может быть преобразован в последовательность байтов UTF-8, представленную как тип bytes, с помощью метода encode(). Аналогично последовательность байтов UTF-8 может быть преобразована обратно в str с помощью метода decode() для типа bytes.

    Существует три критерия, которым должны соответствовать фиктивные данные, используемые в операции одноразового шифрования, чтобы полученный результат невозможно было взломать. Фиктивные данные должны быть той же длины, что и исходные, быть действительно случайными и полностью секретными. Первый и третий критерии диктует здравый смысл. Если фиктивные данные повторяются, потому что слишком короткие, может наблюдаться закономерность. Если один из ключей не является действительно секретным (например, повторно применяется в другом месте или частично раскрыт), то у злоумышленника будет подсказка. Второй же критерий ставит вопрос: можем ли мы генерировать действительно случайные данные? Для большинства компьютеров ответ - нет.

    В этом примере задействуем функцию генерации псевдослучайных данных token_bytes() из модуля secrets (впервые включен в стандартную библиотеку в Python 3.6). Наши данные не будут действительно случайными в том смысле, что внутри пакета secrets все еще применяется генератор псевдослучайных чисел, но для наших целей он будет достаточно близок к случайному. Сгенерируем случайный ключ для использования в качестве фиктивных данных.

from secrets import token_bytes 
from typing import Tuple


def random_key(length: int) -> int:
    # генерировать Length случайных байтов 
    tb: bytes = token_bytes(length)
    # преобразовать эти байты в битовую строку и вернуть ее 
    return int.from_bytes(tb, "big")

    Эта функция создает int длиной length, заполненный случайными байтами. Для преобразования байтов в int используется метод int.from_bytes(). Как преобразовать несколько байтов в одно целое число? Ответ находится в 8 шаге. Прочитав его, вы узнали, что тип int может иметь произвольный размер, и увидели, как его можно задействовать в качестве универсальной строки битов. Здесь тип int используется таким же образом. Например, метод from_bytes() принимает 7 байт (7 байт * 8 бит = 56 бит) и преобразует их в 56-битное целое число. Почему это полезно? Побитовые операции могут выполняться легче и производительнее для одного int (читается как "длинная строка битов"), чем для множества отдельных байтов, представленных в виде последовательности. И мы собираемся применить побитовую операцию XOR.

    На следующем шаге мы рассмотрим шифрование и дешифрование.




Предыдущий шаг Содержание Следующий шаг