# Практическая работа №5 — Конфиденциальный обмен сообщениями Клиент-серверное приложение для обмена сообщениями по TCP с поддержкой шифрования 3DES-CBC (с затравкой; ключ сессии из SHA-256 от ключа файла и соли), контроля целостности сообщения **MD5** (по варианту, как в работе №2) и опциональной аутентификации отправителя **HMAC-SHA256**. ## Установка ```bash uv sync ``` ## Ключ шифрования Ключ хранится в текстовом файле (не менее 32 символов). Права на файл — только чтение владельцем (`600`). Программа проверяет права при запуске и отказывается работать, если файл доступен группе или другим пользователям. ```bash openssl rand -hex 32 > key.txt chmod 600 key.txt ``` ## Запуск ### Сервер ```bash uv run main.py server --port 9000 # без шифрования uv run main.py server --port 9000 --encrypt # 3DES-CBC uv run main.py server --port 9000 --encrypt --integrity # + MD5 digest uv run main.py server --port 9000 --encrypt --integrity --test-integrity # отправка с повреждённым хэшем uv run main.py server --port 9000 --encrypt --hmac # 3DES + HMAC-SHA256 uv run main.py server --port 9000 --hmac # только HMAC (без шифрования) uv run main.py server --port 9000 --key /path/to/key.txt --encrypt # другой файл ключа ``` ### Клиент ```bash uv run main.py client 127.0.0.1 9000 uv run main.py client 127.0.0.1 9000 --encrypt uv run main.py client 127.0.0.1 9000 --encrypt --integrity uv run main.py client 127.0.0.1 9000 --encrypt --integrity --test-integrity uv run main.py client 127.0.0.1 9000 --encrypt --hmac uv run main.py client 127.0.0.1 9000 --encrypt --hmac --test-integrity ``` ## Режимы работы | Флаг | Описание | |------|----------| | *(без флагов)* | Открытый текст, без проверки целостности | | `--encrypt` | Шифрование 3DES-CBC с затравкой (соль + IV генерируются случайно для каждого сообщения) | | `--integrity` | Контроль целостности — MD5-хэш открытого текста (по индивидуальному заданию) | | `--hmac` | HMAC-SHA256 — контроль целостности + аутентификация отправителя (требует ключ, несовместим с `--integrity`) | | `--test-integrity` | Режим тестирования: отправляется заведомо некорректный хэш/HMAC (требует `--integrity` или `--hmac`) | ## Анализ трафика с помощью tcpdump Для наблюдения за передаваемыми данными удобно использовать `tcpdump`. При работе на одной машине (loopback): ```bash sudo tcpdump -i lo -X -n tcp port 9000 ``` При работе по сети (замените `eth0` на имя сетевого интерфейса): ```bash sudo tcpdump -i eth0 -X -n tcp port 9000 ``` - **Без шифрования** — в дампе видны сообщения открытым текстом (JSON с полем `"data": "текст сообщения"`). - **С шифрованием** — в дампе видны только шифротекст, соль и IV в hex; читаемый текст отсутствует.