package infosecmodules import ( "rubric/utils" ) var CryptoModule = Module{ Key: "crypto", Aliases: []string{"cr", "encryption", "крипто"}, Title: "Криптография", Description: "Симметричная/асимметричная криптография, хэши, MAC, алгоритмы", Run: showCrypto, } func showCrypto() { utils.Header("InfoSec — Криптография") utils.Section("Основные понятия") utils.Code(`Plaintext — открытый текст (исходные данные) Ciphertext — зашифрованные данные Encryption — процесс шифрования Decryption — расшифровка Key — ключ (параметр алгоритма) Algorithm — математический метод шифрования Protocol — набор правил использования алгоритмов Принцип Керкхоффса: Алгоритм может быть публичным. Безопасность зависит только от секретности ключа. (Не полагайтесь на "Security Through Obscurity"!)`) utils.Section("Симметричная криптография") utils.Code(`Один ключ — для шифрования И расшифровки. Быстро, подходит для больших объёмов данных. Проблема: как безопасно передать ключ? Алгоритмы: AES (Advanced Encryption Standard) — стандарт, ключи 128/192/256 бит ChaCha20 — альтернатива AES, быстро на мобильных без AES-NI 3DES — устаревший (DES × 3), не использовать в новых системах Blowfish — устарел Режимы AES: ECB — каждый блок шифруется независимо (НЕБЕЗОПАСНО, паттерны видны!) CBC — каждый блок XOR с предыдущим шифротекстом, нужен IV CTR — счётчик + nonce, превращает блочный в поточный GCM — CTR + аутентификация (рекомендуется!) AES-256-GCM — золотой стандарт симметричного шифрования. # OpenSSL пример: openssl enc -aes-256-cbc -in file.txt -out file.enc -k password openssl enc -d -aes-256-cbc -in file.enc -out file.txt -k password`) utils.Section("Асимметричная криптография (PKC)") utils.Code(`Два математически связанных ключа: Public key — публичный, можно раздавать всем Private key — приватный, хранить в секрете Операции: Шифрование: зашифровать публичным → расшифровать приватным Подпись: подписать приватным → верифицировать публичным Алгоритмы: RSA — классика, ключи 2048/4096 бит Медленный для больших данных (используется для ключей и подписей) ECDSA — на эллиптических кривых, меньший ключ = та же стойкость 256 бит ECDSA ≈ 3072 бит RSA Ed25519 — Edwards curve DSA, быстрый и надёжный (SSH, TLS 1.3) ECDH — Elliptic Curve Diffie-Hellman (обмен ключами) DHE — Diffie-Hellman Ephemeral (Perfect Forward Secrecy) RSA — как работает (упрощённо): p, q — большие простые числа n = p * q (публичный модуль) e — публичная экспонента (обычно 65537) d — приватная экспонента (из p, q, e) Шифрование: C = M^e mod n Расшифровка: M = C^d mod n # Генерация RSA ключа: openssl genrsa -out private.key 4096 openssl rsa -in private.key -pubout -out public.key # Генерация Ed25519: openssl genpkey -algorithm Ed25519 -out private.key`) utils.Section("Хэш-функции") utils.Code(`Хэш — детерминированное преобразование произвольных данных в строку фиксированной длины. Свойства криптографического хэша: 1. Детерминизм — одни данные → один хэш всегда 2. Скорость — быстро вычислять 3. Лавинный эффект — 1 бит изменения → ~50% хэша меняется 4. Необратимость — по хэшу нельзя восстановить данные 5. Устойчивость к коллизиям — разные данные → разные хэши Алгоритмы: MD5 — 128 бит, СЛОМАН (коллизии), только для чексумм SHA-1 — 160 бит, СЛОМАН, не использовать для безопасности SHA-256 — 256 бит, стандарт (семейство SHA-2) SHA-512 — 512 бит, более стойкий SHA-3 — альтернативный дизайн (Keccak), не SHA-2 BLAKE2 — быстрее SHA, рекомендуется для checksums BLAKE3 — новый, ещё быстрее Применение: Контроль целостности файлов Хранение паролей (с солью!) Цифровые подписи (подписывается хэш, а не сами данные) HMAC, доказательство работы (PoW) # Примеры: sha256sum file.txt echo -n "hello" | sha256sum openssl dgst -sha256 file.txt`) utils.Section("Хранение паролей") utils.Code(`НИКОГДА не хранить пароли в открытом виде! НИКОГДА не использовать обычный MD5/SHA для паролей! Почему обычный хэш не подходит: - Rainbow tables (предвычисленные таблицы хэшей) - GPU-брутфорс: миллиарды SHA-256 в секунду Правильные алгоритмы для паролей (медленные!): bcrypt — стандарт, cost factor масштабируется scrypt — память-затратный (сложнее для GPU) Argon2 — победитель PHC, рекомендуется (argon2id) PBKDF2 — много итераций, используется в WPA2, iOS Соль (Salt) — случайные данные, добавляемые к паролю перед хэшированием. Защита от rainbow tables. Уникальная для каждого пользователя. Хранится вместе с хэшем (не секрет). # Python пример: import bcrypt hashed = bcrypt.hashpw(b"password", bcrypt.gensalt(rounds=12)) bcrypt.checkpw(b"password", hashed) # True # Формат bcrypt хэша: $2b$12$saltbase64hashedpasswordbase64 # $2b$ — версия # $12$ — cost factor (2^12 итераций) # следующие 22 символа — соль # остальное — хэш`) utils.Section("MAC и аутентифицированное шифрование") utils.Code(`MAC (Message Authentication Code) — обеспечивает целостность и подлинность. В отличие от хэша: зависит от секретного ключа. Защищает от подделки (атаки MITM). HMAC (Hash-based MAC): HMAC(key, message) = H((key XOR opad) || H((key XOR ipad) || message)) HMAC-SHA256 — стандарт. Используется в JWT, API-подписях, TLS. Аутентифицированное шифрование (AEAD): Шифрование + MAC в одном алгоритме. AES-GCM — самый популярный ChaCha20-Poly1305 — альтернатива без AES-NI AEAD = шифрование (конфиденциальность) + authentication (целостность + подлинность) # HMAC пример: import hmac, hashlib mac = hmac.new(b'secret_key', b'message', hashlib.sha256) print(mac.hexdigest()) # OpenSSL: echo -n "message" | openssl dgst -sha256 -hmac "secret_key"`) utils.Section("Perfect Forward Secrecy (PFS)") utils.Code(`PFS — компрометация долгосрочного ключа не раскрывает прошлые сессии. Без PFS: Злоумышленник записывает трафик → получает приватный ключ → расшифровывает ВСЕ записанные сессии. С PFS (DHE/ECDHE): Для каждой сессии генерируются временные (ephemeral) ключи. После сессии они удаляются. Расшифровать прошлые сессии НЕВОЗМОЖНО. TLS шифры с PFS: ECDHE-RSA-AES256-GCM-SHA384 (рекомендуется) ECDHE-ECDSA-AES256-GCM-SHA384 (рекомендуется) DHE-RSA-AES256-GCM-SHA384 (медленнее) Шифры без PFS (избегать!): RSA-AES256-CBC-SHA — RSA напрямую для обмена ключами`) utils.Section("Квантовая криптография и постквантовые алгоритмы") utils.Code(`Квантовые компьютеры угрожают RSA и ECC (алгоритм Шора). SHA-256 и AES-256 остаются стойкими (алгоритм Гровера лишь вдвое снижает стойкость). NIST Post-Quantum Standards (2024): ML-KEM (CRYSTALS-Kyber) — обмен ключами (замена ECDH) ML-DSA (CRYSTALS-Dilithium) — цифровые подписи SLH-DSA (SPHINCS+) — подписи на решётках Гибридный подход (рекомендуется сейчас): X25519 + ML-KEM — классика + постквантовый (используется в TLS 1.3, Chrome)`) utils.Footer() }