209 lines
10 KiB
Go
Executable file
209 lines
10 KiB
Go
Executable file
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()
|
||
}
|