Cryptography

Rýchla orientácia v kryptografických úlohách — rozpoznanie typu, postup riešenia a príkazy. Nie učebnica; detailné nástroje pribudnú neskôr v sekcii Tools.

Obsah

  1. Rozhodovací strom
  2. Základné rozlíšenie
  3. Typický workflow
  4. Encoding
  5. Hash — identifikácia a crack
    1. Hash súboru (výpočet)
    2. Heslá — rozpoznanie a crack
    3. Dĺžka hex reťazca (bez prefixu)
    4. Crack — rýchla referencia
    5. Bežné pasce
  6. XOR
  7. RSA
    1. Čo znamenajú symboly
    2. Tabuľka útokov
  8. Modulárna aritmetika (minimum pre lab)
  9. Diffie–Hellman
  10. GPG / OpenPGP
  11. SSH kľúče
  12. Certifikáty a TLS
  13. Symetrické šifry
  14. Klasické šifry (rýchla referencia)
  15. Nástroje — prehľad
    1. Lokálne / CLI
    2. Webové
  16. Časté chyby pri riešení
  17. Slovníček
  18. Ďalej (Tools — pripravované)

Web tools: browser-based CTF links (hash lookup, CyberChef, cert decoders…) → [CTF Web Tools](/cheatsheets/ctf-web-tools/)

Rozhodovací strom

Vstupný súbor / reťazec
│
├─ Čitateľné písmená, A-Za-z0-9+/=, krátke bloky?
│   └─ Encoding (Base64, hex, ROT…) → sekcia Encoding
│
├─ Hex pevná dĺžka (32/40/64/128 znakov) alebo $1$ / $6$ ?
│   └─ Hash → sekcia Hash
│
├─ „Náhodný“ binárny text, opakujúce sa vzory?
│   └─ XOR / stream → sekcia XOR
│
├─ Čísla n, e, c alebo RSA v zadaní?
│   └─ RSA → sekcia RSA
│
├─ Parametre p, g, A, B (Diffie–Hellman)?
│   └─ DH → sekcia Diffie–Hellman
│
├─ -----BEGIN …----- / .gpg / .asc ?
│   └─ OpenPGP → sekcia GPG
│
├─ id_rsa, authorized_keys, known_hosts?
│   └─ SSH kľúče → sekcia SSH
│
├─ .pem, .crt, cert v pcap?
│   └─ Certifikáty & TLS → sekcia TLS
│
└─ Bloky 16 B, AES v hinte?
    └─ Symetrické šifry → sekcia Symetrické

CTF tip: ak prvý krok nič nedá, skús obrátit poradie vrstiev (najprv XOR, potom Base64 — alebo naopak). Vrstvenie je bežnejšie než „silná“ šifra.

Základné rozlíšenie

Operácia Vstup Výstup Tajný kľúč? Účel
Hash ľubovoľné dáta pevná dĺžka nie (jednosmerné) integrita, heslá
Symetrická šifra plaintext ciphertext áno (ten istý kľúč) dôvernosť
Asymetrická (RSA…) plaintext ciphertext áno (privátny) výmena kľúčov, podpis
Podpis správa podpis privátny kľúč autenticita
Encoding dáta text nie reprezentácia (Base64, hex)

Encoding ≠ šifra. Base64 a hex sa dajú ľahko vrátiť späť bez kľúča.

Typický workflow

1. file / strings / binwalk na vstup
2. Odstráň encoding vrstvy (Base64, hex, ROT) — opakuj, kým to dáva zmysel
3. hashid alebo vizuálna dĺžka → hash vs cipher?
4. Prečítaj hint: n,e,c / key length / IV / passphrase / flag formát
5. Slabé útoky najprv: 1-byte XOR, malé n, rockyou, known plaintext
6. Over výsledok: flag{ … } / čitateľný ASCII / JSON
7. Stále nič? → endian (hex vs decimal), zlý modul, zlá vrstva, chýbajúci súbor

Encoding

Vidíš Pravdepodobne Príkaz / nástroj
A-Za-z0-9+/= (padding =) Base64 base64 -d, CyberChef, Base64 Decode
Len 0-9a-f, párna dĺžka Hex xxd -r -p, CyberChef
A-Z2-7= Base32 CyberChef, cryptii
Iba veľké písmená A–Z Caesar / ROT rot13, brute 1–25, dCode — Caesar
..- .-- . Morse CyberChef, cryptii
\x41\x42 v Python dump Escaped hex decode, potom hex

Web: univerzálny „všetko v jednom“ je CyberChef; na klasické šifry a automatickú detekciu skús dCode alebo Boxentriq.

# Base64
echo 'SGVsbG8=' | base64 -d

# Hex → súbor
echo '666c6167' | xxd -r -p

# ROT všetky posuny (bash)
for i in $(seq 1 25); do echo "$i: $(echo 'TEXT' | tr A-Za-z N-ZA-Mn-za-m)"; done

Vrstvenie: Base64 → hex → XOR → flag je klasická postupnosť. Po každom kroku skontroluj entropiu a čitateľnosť.

Hash — identifikácia a crack

Hash súboru (výpočet)

Máš súbor a potrebuješ z neho hash — na porovnanie, overenie integrity alebo pred crackom:

md5sum subor.bin
sha1sum subor.bin
sha256sum subor.bin
sha512sum subor.bin

openssl dgst -md5 subor.bin
openssl dgst -sha256 subor.bin

# Windows (PowerShell)
Get-FileHash subor.bin -Algorithm SHA256
certutil -hashfile subor.bin SHA256

Výstup porovnaj s hashom v zadaní, DB alebo hash.txt. Ak držíš len hex reťazec (nie celý súbor), pozri tabuľku nižšie a hashid.

Heslá — rozpoznanie a crack

Postup: nájdi hash → rozpoznaj formát (prefix / hashid) → priprav vstup pre john/hashcat → wordlist → --show

Vidíš / odkiaľ Typ Hashcat -m John --format
$1$… md5crypt (starý Linux) 500 md5crypt
$5$… sha256crypt 7400 sha256crypt
$6$… sha512crypt (Linux) 1800 sha512crypt
$2a$ / $2b$ / $2y$ bcrypt 3200 bcrypt
$apr1$… Apache htpasswd 1600
$P$ / $H$ WordPress phpass 400 phpass
{SSHA}… LDAP salted SHA-1 1410 ldap
$y$… yescrypt 18000
32 hex, Windows dump NTLM 1000 nt
user:32hex v DB často MD5 hesla 0 Raw-MD5

Kde hľadať hash v labe: /etc/shadow + /etc/passwd, SQL/DB dump, .htpasswd, WordPress DB, config.php, env, git history, backup ZIP, komentár v kóde, Windows SAM (s SYSTEM).

# Linux — john chce username:hash
unshadow /etc/passwd /etc/shadow > unshadowed.txt
john --wordlist=/usr/share/wordlists/rockyou.txt unshadowed.txt
john --show unshadowed.txt

# jeden hash do súboru (formát user:hash alebo celý riadok zo shadow)
echo 'admin:$6$rounds=5000$...' > hash.txt
# Identifikácia
hashid -m hash.txt          # -m = hashcat mode
hash-identifier             # interaktívne

# Hashcat — režimy útoku
hashcat -m 1800 -a 0 hash.txt rockyou.txt              # slovník
hashcat -m 0 -a 3 hash.txt ?a?a?a?a?a?a               # maska (6 znakov)
hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule   # slovník + pravidlá
hashcat --example-hashes | grep -i sha512              # nájdi správny -m
hashcat -m 1800 hash.txt rockyou.txt --show             # výsledok

# John
john --list=formats | grep -i crypt
john --format=sha512crypt --wordlist=rockyou.txt hash.txt
john --show --format=sha512crypt hash.txt

Tip: pri $6$ / bcrypt nech v súbore celý reťazec vrátane saltu — john/hashcat si salt berú z formátu. Pri NTLM ide často o 32 hex znakov bez $.

Online lookup (MD5/SHA, wordlist): pred dlhým crackom skús CrackStation, hashes.com alebo md5decrypt.net — ak hash už niekto crackol, dostaneš heslo hneď. Na výpočet hashu z textu: emn178 online tools.

Dĺžka hex reťazca (bez prefixu)

Dĺžka (hex znakov) Typicky algoritmus
32 MD5
40 SHA-1
64 SHA-256
128 SHA-512
34 MySQL * (SHA1 double)
56 bcrypt $2a$ / $2b$
96+ sha512crypt $6$

Ak má hash prefix ($6$, $2b$…), použi tabuľku v sekcii Heslá vyššie. Tu platí pre „holý“ hex bez hlavičky:

hashid hash.txt
hash-identifier

Crack — rýchla referencia

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
john --format=Raw-MD5 hash.txt
john --show hash.txt

hashcat -m 0 -a 0 hash.txt rockyou.txt          # MD5
hashcat -m 1000 -a 0 hash.txt rockyou.txt       # NTLM
hashcat -m 1800 -a 0 hash.txt rockyou.txt       # sha512crypt
hashcat -m 3200 -a 0 hash.txt rockyou.txt       # bcrypt

Detailnejšie formáty a útoky → sekcia Heslá — rozpoznanie a crack vyššie.

Bežné pasce

  • Double hash — MD5(MD5(pass)), over v kóde alebo skripte challenge
  • Salt v súbore — neoddeľuj od hashu; formát $algo$salt$hash
  • HMAC — potrebuješ kľúč (hint: názov súboru, secret, krátke slovo)
  • „Verify password“ — často len porovnanie hashu, nie live login

OSCP/lab tip: rockyou.txt prvých 10k–50k riadkov často stačí; pre bcrypt počítaj s časom.

XOR

Typ Ako poznáš Postup
Single-byte 256 možností, krátky ciphertext brute 0x00–0xFF, hľadaj flag{
Repeating-key periodické opakovanie zisti dĺžku kľúča, potom kľúč
Known plaintext známy prefix (flag{, HTB{) key[i] = cipher[i] ⊕ plain[i]
XOR + encoding po Base64 stále „smetie“ skús XOR pred aj po dekódovaní
# Single-byte XOR brute
c = open('enc', 'rb').read()
for k in range(256):
    p = bytes(b ^ k for b in c)
    if b'flag{' in p or b'FLAG{' in p:
        print(k, p)

# Known plaintext — obnovenie začiatku kľúča
c = bytes.fromhex('...')
known = b'flag{'
key = bytes(c[i] ^ known[i] for i in range(len(known)))
# xortool — odhad dĺžky kľúča
xortool enc.txt
xortool -l 4 -c 20 enc.txt   # key length 4, charset

Web: single-byte a repeating-key XOR vizuálne v CyberChef (operácia XOR); na analýzu binárnych dát Boxentriq — Binary Analysis.

Vlastnosť: A ⊕ B ⊕ B = A. Ak nájdeš kľúč na jednom bloku, aplikuj na celý súbor.

RSA

Čo znamenajú symboly

Symbol Význam
n modul (n = p × q)
e verejný exponent (často 65537 alebo 3)
d súkromný exponent
c ciphertext
m plaintext (číslo)

Dekódovanie: m = c^d mod n Šifrovanie: c = m^e mod n

Tabuľka útokov

Podmienka Útok Nástroj
Malé n (faktorizovateľné) rozklad na p, q factordb.com, Sage factor(n)
e = 3, malé m priamy odmocnina Sage nth_root(c, 3)
Rovnaké n, rôzne e, rovnaké m Hastad broadcast CRT
Veľké e, malé d Wiener RsaCtfTool
Dva moduly, gcd(n1,n2) > 1 spoločný faktor gmpy2.gcd
p ≈ q Fermat RsaCtfTool
dp, dq, qinv unikli direct decrypt RsaCtfTool
# Python — dekódovanie keď máš p, q, e, c
from sympy import mod_inverse
p, q, e, c = ...
phi = (p - 1) * (q - 1)
d = mod_inverse(e, phi)
m = pow(c, d, p * q)
# m → bytes: m.to_bytes((m.bit_length()+7)//8, 'big')
# RsaCtfTool — automatické útoky
python3 RsaCtfTool.py -n 0x... -e 0x... --uncipher 0x...
python3 RsaCtfTool.py --publickey pubkey.pem --uncipherfile cipher.bin
# Sage — faktorizácia a discrete log
n = 123456789
factor(n)

# modulárna inverzia
pow(e, -1, phi)

Lab tip: ak dostaneš .pem s BEGIN RSA PRIVATE KEY, openssl rsa -in key.pem -text vypíše n, e, d.

Modulárna aritmetika (minimum pre lab)

# modulárna inverzia (Python 3.8+)
pow(a, -1, m)   # a^(-1) mod m

# GCD — spoločný faktor dvoch RSA modulov
import math
math.gcd(n1, n2)

# Čínskou zvyškovou vetou — viac rovníc x ≡ a (mod n)
# Sage: crt([a1, a2], [n1, n2])
Operácia Kedy v úlohe
gcd(n1, n2) dva RSA kľúče z jednej factory
pow(c, d, n) dekódovanie RSA
pow(a, -1, m) nájdenie d z e a φ(n)
CRT Hastad, viac súčasne congruences

Diffie–Hellman

Účel: dve strany si dohodnú zdieľané tajomstvo cez verejný kanál.

Spoločné: prvočíslo p, generátor g
Alice: tajné a, verejné A = g^a mod p
Bob:   tajné b, verejné B = g^b mod p
Zdieľané tajomstvo: s = B^a mod p = A^b mod p
p, g, A, B = ...
# ak máš súkromné a:
s = pow(B, a, p)
# ak máš súkromné b:
s = pow(A, b, p)
Situácia v úlohe Postup
Malé p (< 25 bit) brute / Sage discrete_log
g alebo p podozrivé weak DH — skontroluj známe zlé parametre
MITM v príbehu prepočítaj s s oboma stranami, porovnaj

Poznámka: DH sám o sebe neoveruje identitu — preto v praxi certifikát alebo known host key.

GPG / OpenPGP

Súbor Obsah
pubkey.asc verejný kľúč (šifrovanie pre teba)
privkey.asc súkromný kľúč
message.gpg / .asc šifrovaná alebo podpísaná správa
gpg --import pubkey.asc
gpg --import privkey.asc

gpg -d message.gpg                    # dešifrovanie
gpg --decrypt --output out.txt enc.gpg

gpg --verify signature.asc data.txt     # overenie podpisu

# export hash pre john (encrypted private key)
gpg2john privkey.asc > hash.john
john --wordlist=rockyou.txt hash.john
Situácia Čo urobiť
Máš privátny kľúč + passphrase v hinte import → decrypt
Len pubkey hľadaj privátny kľúč inde (git, backup, stego)
Podpísaná správa --verify, nie decrypt
Slabá passphrase gpg2john + john/hashcat

SSH kľúče

Súbor Účel
id_rsa / id_ed25519 privátny kľúč — pripojenie
id_rsa.pub verejný kľúč
authorized_keys povolené verejné kľúče na serveri
known_hosts odtlačky serverov (nie crack)
chmod 600 id_rsa
ssh -i id_rsa user@target

# crack passphrase na kľúči
ssh2john id_rsa > hash.john
john --wordlist=rockyou.txt hash.john

# hashcat
hashcat -m 22931 hash.txt rockyou.txt   # RSA, over --example-hashes

Lab tip: kľúč bez passphrase sa dá použiť hneď. Passphrase býva v rovnakom ZIP, env, alebo password123.

Podrobnejšie: [SSH port 22 cheatsheet](/cheatsheets/ssh-port-22/).

Certifikáty a TLS

# obsah certifikátu
openssl x509 -in cert.pem -text -noout

# cert z webu
openssl s_client -connect host:443 -showcerts /dev/null | openssl x509 -text -noout

# extrahovanie pubkey z cert
openssl x509 -in cert.pem -pubkey -noout > pubkey.pem

# overenie podpisu (CA chain)
openssl verify -CAfile ca.pem cert.pem
V úlohe Postup
Self-signed cert extrahuj pubkey, ignoruj trust warning
.pem + .key spáruj modulus: openssl rsa -in key.pem -modulus vs cert
TLS v pcap export sslkey.log alebo dekóduj v Wireshark s kľúčom
Weak hash v cert (MD5) skôr forenzia; zriedka priamy flag

Web — certifikáty a TLS:

Nástroj Na čo
SSL Shopper — Certificate Decoder vlož PEM, prečítaj CN, SAN, platnosť, pubkey
SSL Labs — SSL Test audit TLS konfigurácie verejného hosta
Let’s Encrypt bezplatná CA, dokumentácia PKI
Certbot generátor príkazov na získanie/renew certu

Symetrické šifry

Algo Typický scenár Postup
AES-ECB opakujúce sa 16B bloky ECB bit flip / pattern; identický blok = rovnaký plaintext
AES-CBC IV v súbore / header openssl enc -d -aes-256-cbc -K -iv
DES / 3DES legacy openssl enc -des-ecb -d -K ...
RC4 stream v starších protokoloch CyberChef, custom script
# OpenSSL — hex key a IV
openssl enc -d -aes-256-cbc -in enc.bin -out plain.txt \
  -K 0123456789abcdef0123456789abcdef \
  -iv 00000000000000000000000000000000

# key z hesla (PBKDF)
openssl enc -d -aes-256-cbc -in enc -out dec -pass pass:heslo

Web: AES/DES/RC4 bez príkazového riadka — CyberChef alebo emn178 — Cryptography (AES, DES, RSA…).

Kľúč často nie je v challenge — je v predchádzajúcom kroku (súbor, env, cracknutý hash).

Klasické šifry (rýchla referencia)

Šifra Poznáš Riešenie
Caesar / ROT-N len písmená 26 posunov, dCode
Vigenère opakujúci sa kľúč Kasiski, dCode — Vigenère
Affine a*x+b mod 26 brute a (gcd(a,26)=1), b, dCode
Substitution frequency EN/SK quipqiup, CyberChef
Bacon A/B alebo dvojice 5 bitov na písmeno, dCode — Bacon
Rail fence „zigzag“ CyberChef, Boxentriq

Nástroje — prehľad

Lokálne / CLI

Nástroj Na čo
hashid / hash-identifier typ hashu
john / hashcat crack hashov, ssh, gpg
RsaCtfTool RSA útoky
xortool dĺžka XOR kľúča
SageMath factor, discrete_log, CRT, mod inverse
openssl AES, cert, enc/dec
gpg OpenPGP
gmpy2 gcd, pow, large integers

Webové

Nástroj URL Na čo
CyberChef gchq.github.io/CyberChef encoding, XOR, AES, vizuálne skúšanie
dCode dcode.fr klasické šifry, automatická detekcia
Boxentriq boxentriq.com CTF — detekcia formátu, Morse, Vigenère, stego
CrackStation crackstation.net lookup MD5/SHA1/SHA256 (wordlist)
hashes.com hashes.com lookup + submit hashov
md5decrypt.net md5decrypt.net lookup MD5/SHA
emn178 online tools emn178.github.io hash, AES, RSA, Base64/hex
factordb factordb.com už faktorizované RSA n
quipqiup quipqiup.com substitution cipher solver
SSL Shopper sslshopper.com dekódovanie PEM certifikátu
SSL Labs ssllabs.com test TLS na hoste
Let’s Encrypt letsencrypt.org bezplatná CA, PKI docs
Certbot certbot.eff.org získanie/renew Let’s Encrypt certu

Časté chyby pri riešení

  • Dekódovanie Base64 pred XOR, hoci bolo treba naopak
  • Zabudnutý endian — hex reťazec vs integer pre RSA
  • RSA m ako číslo — treba long_to_bytes, nie ASCII priamo
  • Hash bez salt — john nevie cracknúť, ak si salt odsekol
  • Padding v AES — zlý IV alebo režim (ECB vs CBC)
  • Hľadanie flagu bez kontroly formátu — over flag{, {, printable ratio

Slovníček

Pojem Význam
Ciphertext zašifrované dáta
Plaintext pôvodné dáta
Salt náhodná prídavok k heslu pred hashom
IV / nonce inicializačný vektor — musí byť unikátny (CBC/GCM)
KEX key exchange (SSH, TLS handshake)
MAC overenie integrity so zdieľaným tajomstvom
PKI hierarchia certifikačných autorít
Known plaintext čiastočne známy otvorený text — útok na XOR
CRT Chinese Remainder Theorem — viac congruences naraz
φ(n) Euler totient — (p-1)(q-1) pre RSA

Ďalej (Tools — pripravované)

Detailné kalkulačky a interaktívne nástroje pribudnú v sekcii Tools → Kryptografia (RSA solver, XOR brute, hash mode lookup, GPG helper). Tento cheatsheet zostáva mapou čo kedy použiť; konkrétne kroky s UI budú tam.

TheOldOne · Miroslav Gensor ·