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