rubric/modules/infosecmodules/infosec_crypto.go

209 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}