Задание

Криптография

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

set PATH=Z:\ИСиТ\OpenSSL;%PATH%

Утилита openssl объединяет очень разные функции. Как правило, первый аргумент openssl — команда (слово), затем следуют ключи команды (параметры с дефиса). Список команд можно получить через openssl help. По любой команде можно получить справку так: openssl <команда> -help.

Симметричное шифрование

  1. Получите один псевдослучайный килобайт для использования в качестве ключа:

    openssl rand -out symmetric.key 1024
  2. Зашифруйте файл с сообщением при помощи шифратора AES-256-CBC с полученным ключом:

    openssl enc -e -kfile symmetric.key -in message.txt -out message.enc -aes-256-cbc

Здесь -e означает шифрование (команда enc используется и для расшифровки с ключом -d).

  1. Расшифруйте файл обратно:

    openssl enc -d -kfile symmetric.key -in message.enc -out message.dec -aes-256-cbc

    Проверьте, что оригинал открытого текста совпадает с восстановленным:

    comp message.txt message.dec

    (ОС семейтсва *nix используют для той же цели программу cmp.)

Генерация ключевой пары

  1. Создайте закрытый (приватный) ключ размером 2048 бит для алгоритма RSA:

    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out alice.pri

Команда генерирует только закрытый ключ, потому что открытый можно восстановить из закрытого (это остаток от его деления на известное простое число). Закрытый ключ используется для расшифровки и нанесения электронной подписи, поэтому его необходимо держать в тайне.

  1. Получите открытый ключ из закрытого:

    openssl pkey -in alice.pri -out alice.pub -pubout

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

  1. Создайте еще две ключевые пары Боба и Чарли: bob.pri с bob.pub и charlie.pri с charlie.pub соответственно.

Асимметричное шифрование

  1. Зашифруйте сообщение открытым ключом Алисы:

    openssl rsautl -encrypt -pubin -inkey alice.pub -in message.txt -out message.rsa.enc
  2. Расшифруйте сообщение закрытым ключом Алисы:

    openssl rsautl -decrypt -inkey alice.pri -in message.rsa.enc -out message.rsa.dec

    Проверьте, что восстановленный открытый текст соответствует оригиналу.

  3. Убедитесь, что расшифровать сообщение закрытым ключом Боба нельзя.

Электронная цифровая подпись (ЭЦП)

  1. Сформируйте ЭЦП сообщения, то есть его хэш, зашифрованный закрытым ключом.

    openssl dgst -sha256 -sign alice.pri -out message.txt.sig message.txt
  2. Выполните проверку ЭЦП, то есть расшифровку хэша якобы сообщения открытым ключом и его сличение и хэшем сообщения.

    openssl dgst -sha256 -verify alice.pub -signature message.txt.sig message.txt
  3. Убедитесь, что если подпись формировать закрытым ключом Боба, проверка открытым ключом Алисы покажет отрицательный результат.

Генерация корневого электронного сертификата

  1. Создайте запрос на подпись сертификата (certificate sign request, CSR) для Чарли:

    openssl req -new -key charlie.pri -out charlie.csr

    Сведения о владельце заполните произвольно, кроме Common Name, для которого используйте свое имя латиницей. Последующие поля оставьте пустыми.

    Пример:

  2. Удовлетворите запрос Чарли, использовав для подписи его же закрытый ключ, то есть создайте для Чарли самоподписанный сертификат:

    openssl x509 -req -signkey charlie.pri -in charlie.csr -out charlie.crt -days 365
  3. Просмотрите сертификат Чарли:

    openssl x509 -in charlie.crt -text -noout

Формирование иерархии электронных сертификатов

  1. Создайте запрос на подпись сертификата Алисы.

  2. Подпишите сертификат Алисы ключом Чарли:

    openssl x509 -req -days 365 \
        -CAkey charlie.pri -CA charlie.crt -CAserial charlie.srl -CAcreateserial \
        -in alice.csr -out alice.crt

    Здесь обратные косые черты использованы как символ переноса строк, в Windows следует вести одно длинную строку, убрав \, либо заменить эти символы на ^.

  3. Просмотрите сертификат Алисы.

  4. Проверьте подлинность сертификата Алисы:

    openssl verify -verbose -issuer_checks -CAfile charlie.crt alice.crt
  5. Аналогичным образом создайте сертификат Боба, заверенный Чарли.

Прокси и VPN

Используются внешние серверы, доступ к которым следует получить у лаборантов.

Локальный SOCKS-прокси

Очень просто организовать SOCKS-прокси, имя доступ на удаленный сервер по SSH. При этом прокси-сервер запускается на клиентской машине (где запущена ssh или PuTTY), и программы на ней могут подключиться к указанному порту по адресу 127.0.0.1.

Из консоли прокси-сервер запускается ключом -D с указанием порта:

```
ssh -D 8888 <прочие параметры>
```

При использовании PuTTY необходимо в разделе настроек Connection → SSH → Tunnels в поле Source port ввести локальный порт, к которому должны будут подключаться клиенты, ниже выбрать переключатели Dynamic и IPv4, после чего нажать Add, чтобы в список туннелей оказалась добавлена такая строка: 4D8888, что очевидно.

Для работы прокси необходимо оставить подключенный терминал открытым.

В распространенных ОС имеются системные настройки прокси, откуда их может получить любая программа. Также большая часть ПО, способного работать через прокси, позволяет указать адрес прокси в своих настройках (крупным исключением является Google Chrome и другие браузеры этого семейства).

  1. Организуйте локальный SOCKS5-прокси с выделенным вам сервером.

  2. Настройте бразуер использовать запущенный прокси и убедитесь, что он действительно применяется, то есть запросы к сайтам делаются с адреса сервера. Для этого посетите любой сайт, отображающий адрес IP клиента, с прокси и без него.

VPN

(boss fight)

Напомним, что виртуальная частная сеть (virtual private network, VPN) представляет собой систему туннелей и действует на сетевом уровне.

  1. Настроить сервер OpenVPN и подключиться к нему клиентом, взяв за основу инструкцию.

Для этого можно использовать два внешних сервера, если в лаборатории невозможно установить OpenVPN. Сервер и клиент должны использовать созданные в этой ЛР ранее ключи и сертификаты.


Козлюк Д. А. для кафедры Управления и информатики НИУ «МЭИ», 2018 г. Система Orphus