Переезд на md5

This commit is contained in:
2026-04-04 11:25:35 +03:00
parent 7c83fe5e1a
commit d3a40d4ef7
11 changed files with 44 additions and 40 deletions

3
lab5/.gitignore vendored
View File

@@ -1 +1,2 @@
key.txt
key.txt
*.pyc

View File

@@ -1,8 +1,9 @@
# Практическая работа №5 — Конфиденциальный обмен сообщениями
Клиент-серверное приложение для обмена сообщениями по TCP с поддержкой
шифрования 3DES-CBC (с затравкой), контроля целостности SHA-256 и
аутентификации отправителя HMAC-SHA256.
шифрования 3DES-CBC (с затравкой; ключ сессии из SHA-256 от ключа файла и соли),
контроля целостности сообщения **MD5** (по варианту, как в работе №2) и опциональной
аутентификации отправителя **HMAC-SHA256**.
## Установка
@@ -28,7 +29,7 @@ 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 # + SHA-256
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 (без шифрования)
@@ -52,7 +53,7 @@ uv run main.py client 127.0.0.1 9000 --encrypt --hmac --test-integrity
|------|----------|
| *(без флагов)* | Открытый текст, без проверки целостности |
| `--encrypt` | Шифрование 3DES-CBC с затравкой (соль + IV генерируются случайно для каждого сообщения) |
| `--integrity` | Контроль целостности — к сообщению прикладывается SHA-256 хэш открытого текста |
| `--integrity` | Контроль целостности — MD5-хэш открытого текста (по индивидуальному заданию) |
| `--hmac` | HMAC-SHA256 — контроль целостности + аутентификация отправителя (требует ключ, несовместим с `--integrity`) |
| `--test-integrity` | Режим тестирования: отправляется заведомо некорректный хэш/HMAC (требует `--integrity` или `--hmac`) |

View File

@@ -71,7 +71,7 @@ def decrypt_message(salt: bytes, iv: bytes, ct: bytes, file_key: str) -> str:
def compute_hash(text: str) -> str:
return hashlib.sha256(text.encode()).hexdigest()
return hashlib.md5(text.encode(), usedforsecurity=False).hexdigest()
def compute_hmac(file_key: str, text: str, salt: bytes) -> str:
@@ -136,10 +136,10 @@ def do_send(
if use_integrity:
h = compute_hash(text)
if test_integrity:
h = hashlib.sha256(b"CORRUPTED_" + os.urandom(4)).hexdigest()
print(f" [TX] SHA-256: {h} (CORRUPTED!)")
h = hashlib.md5(b"CORRUPTED_" + os.urandom(4), usedforsecurity=False).hexdigest()
print(f" [TX] MD5: {h} (CORRUPTED!)")
else:
print(f" [TX] SHA-256: {h}")
print(f" [TX] MD5: {h}")
msg["hash"] = h
if use_hmac:
@@ -278,7 +278,7 @@ def run_session(
if use_encrypt:
flags.append("3DES")
if use_integrity:
flags.append("SHA-256")
flags.append("MD5")
if use_hmac:
flags.append("HMAC-SHA256")
if test_integrity:
@@ -328,7 +328,9 @@ def run_client(args: argparse.Namespace) -> None:
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Encrypted messaging (3DES-CBC + SHA-256)")
parser = argparse.ArgumentParser(
description="Encrypted messaging (3DES-CBC; integrity MD5 per assignment; optional HMAC-SHA256)"
)
sub = parser.add_subparsers(dest="role", required=True)
for name, sp in [("server", sub.add_parser("server", help="Start server")),
@@ -339,7 +341,7 @@ def build_parser() -> argparse.ArgumentParser:
sp.add_argument("host")
sp.add_argument("port", type=int)
sp.add_argument("--encrypt", action="store_true", help="Enable 3DES-CBC encryption")
sp.add_argument("--integrity", action="store_true", help="SHA-256 integrity check")
sp.add_argument("--integrity", action="store_true", help="MD5 integrity hash (variant / lab 2)")
sp.add_argument("--hmac", action="store_true", help="HMAC-SHA256 integrity + authentication")
sp.add_argument("--test-integrity", action="store_true", help="Send corrupted hash/HMAC")
sp.add_argument("--key", default=DEFAULT_KEY_FILE, help="Path to key file (default: key.txt)")