Skip to content

Latest commit

 

History

History
255 lines (168 loc) · 11.6 KB

lab08-crypto.md

File metadata and controls

255 lines (168 loc) · 11.6 KB
title lang
Лабораторная работа № 8. Технологии защищенных каналов связи
ru

Задание

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

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

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

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

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

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

```
openssl rand -out symmetric.key 1024
```

(@) Зашифруйте файл с сообщением при помощи шифратора AES-256-CBC с полученным ключом:

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

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

(@) Расшифруйте файл обратно:

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

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

```
comp message.txt message.dec
```

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

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

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

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

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

(@) Получите открытый ключ из закрытого:

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

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

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

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

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

```
openssl rsautl -encrypt -pubin -inkey alice.pub -in message.txt -out message.rsa.enc
```

(@) Расшифруйте сообщение закрытым ключом Алисы:

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

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

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

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

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

```
openssl dgst -sha256 -sign alice.pri -out message.txt.sig message.txt
```

(@) Выполните проверку ЭЦП, то есть расшифровку хэша якобы сообщения открытым ключом и его сличение и хэшем сообщения.

```
openssl dgst -sha256 -verify alice.pub -signature message.txt.sig message.txt
```

(@) Убедитесь, что если подпись формировать закрытым ключом Боба, проверка открытым ключом Алисы покажет отрицательный результат.

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

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

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

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

Пример:

* Country: RU
* State/province: N/A
* Locality: Moscow
* Organization: MPEI
* Organizational Unit: Control and Automation
* Common Name: Alice

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

```
openssl x509 -req -signkey charlie.pri -in charlie.csr -out charlie.crt -days 365
```

(@) Просмотрите сертификат Чарли:

```
openssl x509 -in charlie.crt -text -noout
```

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

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

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

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

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

(@) Просмотрите сертификат Алисы.

(@) Проверьте подлинность сертификата Алисы:

```
openssl verify -verbose -issuer_checks -CAfile charlie.crt alice.crt
```

(@) Аналогичным образом создайте сертификат Боба, заверенный Чарли.

Прокси и 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 и другие браузеры этого семейства).

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

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

VPN

(boss fight)

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

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

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

  • Параметры для протокола Диффи-Хеллмана (dh2048.pem) можно сгенерировать следующим образом:

     openssl dhparam -out dh2048.pem dh2048
    
  • Шаблон конфигурации сервера OpenVPN: openvpn-server.conf

  • Шаблон конфигурации клиента сервеOpenVPN: openvpn-client.conf