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
- Rozhodovací strom
- Základné rozlíšenie
- Typický workflow
- Encoding
- Hash — identifikácia a crack
- XOR
- RSA
- Modulárna aritmetika (minimum pre lab)
- Diffie–Hellman
- GPG / OpenPGP
- SSH kľúče
- Certifikáty a TLS
- Symetrické šifry
- Klasické šifry (rýchla referencia)
- Nástroje — prehľad
- Časté chyby pri riešení
- Slovníček
- Ď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.txtprvý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š
.pemsBEGIN RSA PRIVATE KEY,openssl rsa -in key.pem -textvypíšen,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 |
| 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
mako čí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.