CLI-утилита для шифрования файлов симметричным ключом (паролем).
| Компонент | Алгоритм | Параметры |
|---|---|---|
| Шифр | AES-256-GCM (AEAD) | ключ 256 бит, nonce 96 бит, tag 128 бит |
| KDF | scrypt | N=16384, r=8, p=1 |
| Salt | os.urandom |
32 байта |
| Nonce | os.urandom |
12 байт |
- AES-256-GCM — шифрование + аутентификация целостности за одну операцию (AEAD). Любое изменение ciphertext или tag будет обнаружено при расшифровке.
- scrypt — KDF, устойчивый к GPU/ASIC брутфорсу (в отличие от PBKDF2). Параметры соответствуют рекомендациям OWASP.
- 256-битный ключ — полный размер AES-256, без компромиссов.
- Случайный salt + nonce для каждой операции — один и тот же пароль никогда не даёт одинаковый ciphertext.
| salt (32 байта) | nonce (12 байт) | tag (16 байт) | ciphertext (...) |
python -m venv .venv && source .venv/bin/activate
pip install -e .# Зашифровать
cryptex encrypt secret.txt
# → secret.txt.enc
# Расшифровать
cryptex decrypt secret.txt.enc
# → secret.txt.enc.dec.txt
# С явным выходным файлом
cryptex encrypt secret.txt -o encrypted.bin
cryptex decrypt encrypted.bin -o restored.txtПароль вводится через терминал (getpass), не сохраняется в history.
Hexagonal (ports & adapters):
presentation/cli → argparse, DI wiring
↓
application/use_cases → EncryptFileUseCase, DecryptFileUseCase
↓ (порты)
domain/value_objects → Salt, Nonce, Key, Ciphertext, Password
↓ (адаптеры)
infrastructure/ → AesGcmEngine, ScryptKeyDeriver, DiskFileRepository, CliPasswordProvider
Домен и use cases не зависят от конкретных реализаций — только от абстрактных портов. Это позволяет подменять криптодвижок, KDF, хранилище и источник пароля без изменения бизнес-логики.
pip install -e ".[dev]"
pytest tests/ -v24 теста: unit (domain value objects + use cases с in-memory fakes) + integration (полный цикл AES-256-GCM + scrypt на реальной файловой системе).
- Python >= 3.11
- cryptography >= 42.0