Программы: Информационная безопасность
28.09.2018


Слишком громкий заголовок, учитывая, что я мало чего понимаю в настоящей информационной безопасности. Только базовые вещи вроде SQL-инъекций, XSS- и CSRF-уязвимостей, необходимости шифрования трафика по TLS и SSH и основные принципы их работы, немного про симметричное и ассиметричное шифрование. Ну про признаки хорошего пароля я даже и не говорю, хотя универский курс ИБ посвящает этому вопросу целых две лабораторные работы. В общем, знаю я немного (только самые основы), но раз уж курс пройден и программы на лабораторные работы написаны, то грех их не выложить в своём бложике.


DES

Начну с конца, а именно с пятой лабораторной работы, потому что про первые говорить вообще нечего, так что их просто вкратце упомянем позже.

Сначала я подумал, что нам надо написать свою реализацию алгоритма шифрования DES. И я даже начал работать в этом направлении. Но потом столкнулся с рядом проблем:

  • предоставленная нам программа-пример не демонстрировала все шаги;
  • описания в умных статьях из интернета слишком сложные, непонятные и даже в какой-то степени разные (где-то делают упор на одном, в другой статье больше времени посвящают другому и т. д.);
  • я не очень умный, чтобы во всём этом разобраться :(

После этого я узнал, что на самом деле поставленная перед нами задача куда проще: всего лишь решить тест в программе-примере.

Программа-пример Исходные данные Первый шаг

В результате у меня получилось программа на Котлине, которая автоматизирует примерно половину этого теста.

Результат выполнения DES.jar

Поскольку развивать дальше я её не планирую, то обойдёмся без каких-либо репозиториев по старинке: выкладываю код простым zip-архивом. Проект без проблем импортируется в IntelliJ IDEA и интегрируется с Maven'ом. Но на всякий случай прикладываю и уже собраный JARник со всеми зависимостями.


Гаммирование с использованием конгруэнтного генератора

Четвёртая лаба сразу пугает страшными словами. И это, кстати, забавно. Если зайти на страницу в «Википедии» про гаммирование, а потом перейти на английскую версию статьи, то увидим уже вполне простое и понятное программисту название: XOR cipher. И задача сразу становится проще! Дополнительно прочитав какую-либо из статей, убеждаемся, что нам всего лишь надо проXORить символы шифруемого текста с символами гаммы, которая и будет ключом.

Со второй частью труднее. Нужно всё-таки прочитать статью про этот конгруэнтный генератор и реализовывать его, используя данную там формулу.

Ну что ж. Я опять взял свой любимый Kotlin и «запилил» небольшой сниппет. Попробовать его можно здесь.


Генерируем пароли

Прежде чем переходить к козырю, всё-таки вернёмся к первым двум лабам. Обе они посвящены генерации надёжных паролей для пользователей.

У первой задание состоит из двух простых частей:

  1. определить минимальную длину пароля, устойчивую к заданным условиям взлома;
  2. сгенерировать пароль, удовлетворяющий условиям.

Условия:

  • Вероятность подбора пароля: 10-4;
  • Скорость подбора паролей: 100 паролей в день (да, задача не очень реалистична);
  • Максимальный срок действия пароля: 12 дней.

Поиграться с моей реализацией данной задачи можно здесь (да, опять Kotlin).

Второй задачей было написать программу, которая будет генерировать десятисимвольные пароли из имени пользователя, удовлетворяющие следующим условиям:

  • Q — остаток от деления длины имени пользователя на 6;
  • первые два символа — случайные большие буквы английского алфавита;
  • символы от третьего до 10-Q-1 — случайные малые буквы английского алфавита;
  • оставшиеся символы — случайные цифры.

Эту лабораторку я выполнял, когда Котлин уже немного отпустил, так что эта программа, как и все последующие, написана на Python 3. А из этого следует, что ссылок на удобные онлайн REPLы больше не будет.

В этом сниппете я собрал все лабы из этого раздела (благо они все состоят из одного файла). Следовательно, там код как этого задания, так и предыдущего.

Результат выполнения генератора паролей
Эта картинка из отчёта, поэтому фон командного интерпретатора изменён на светлый, чтобы сэкономить тонер при печати.

В том же сниппете читатель мог заметить небольшой отрывок кода третьей лабораторной работы. Первое задание в ней слабо связано с остальными. Для галочки я его реализовал, но решил присоединить к остальным скриптам-однофайльникам.

Суть задания заключается в том, чтобы определить алфавит введённого текста (множество всех использованных символов) и определить количество их возможных перестановок. Всё.


Шифры перестановки

Наконец мы переходим к самому сладкому. К вишенке на торте этого поста. Скрипт, на который я потратил больше всего времени, но сделал его по всем правилам и канонам. Там даже тесты есть, Карл! К сожалению, для моих проектов это пока редкость…

Данная лабораторная работа позволяет зашифровывать и расшифровывать фразы с помощью шифров маршрутной перестановки. По умолчанию используется простейший вариант табличной перестановки, когда в качестве ключа принимается количество столбцов, на основе которого генерируется таблица, первая строчка которой заполняется буквами фразы слева направо, вторая строчка — справа налево, третья — снова слева направо и так далее. Ответ вычисляется путём повторного прохода таблицы: сначала снизу вверх, начиная с правого нижнего угла, затем сверху вниз и так далее.

Если передать флаг --vertical, то будет использоваться алгоритм вертикальной перестановки. Он принимает в качестве ключа последовательность из n цифр от 1 до n. При этом число n должно быть меньше 10! Оно выступает в роли количества столбцов, которые заполняются слева направо. Затем все столбцы переставляются в соответствии с ключом. Результат получается путём повторного прохода таблицы слева направо и сверху вниз.

Результат работы простой маршрутной перестановки Результат работы вертикальной перестановки

Репозиторий

Скрипт написан на Python 3, так что для работы нужно наличие интерпретатора и менеджер пакетов pip, так как впервые я решил разобраться и запаковать код в полноценный пакет, чтобы позволить setuptools автоматически создать небольшой исполняемый файл в директории, обычно присутствующей в переменной PATH, что позволит с лёгкостью его запускать из командной строки! Для установки достаточно скачать wheel-пакет по ссылке выше и выполнить следующую команду:

pip install --user <путь к скачанному файлу>

Программа вызывается следующим образом:

routecipher [--vertical] [-v] {encrypt,decrypt} ключ текст
АргументОписание
--vertical использовать алгоритм вертикальной перестановки
-v, -vv включает вывод информационных или даже отладочных сообщений
ключ зависит от выбранного метода шифрования; см. описание и примеры на скриншотах выше