Crypto CTF Workflow
A systematic approach to solving cryptography challenges in CTFs and security tasks.
Quick Triage Checklist
When you encounter a crypto challenge, work through these steps in order:
- Identify what you have: Is it encoding, encryption, hash, signature, or MAC?
- Determine what is controlled: Do you have plaintext/ciphertext, IV/nonce, key, oracle (padding/error/timing), or partial leakage?
- Classify the type:
- Symmetric (AES/CTR/GCM)
- Public-key (RSA/ECC)
- Hash/MAC (SHA/MD5/HMAC)
- Classical (Vigenere/XOR/Caesar)
- Apply highest-probability checks first: Decode layers, known-plaintext XOR, nonce reuse, mode misuse, oracle behavior
- Escalate to advanced methods only when required: Lattices (LLL/Coppersmith), SMT/Z3, side-channels
Step 1: Initial Identification
Check for common encodings first
Many CTF crypto tasks are layered transforms: base encoding + simple substitution + compression. Start by peeling layers:
Try these in order:
- Run the
identify_encoding.sh script on your input
- Check for Base64:
A-Za-z0-9+/= (padding = is common)
- Check for Base32:
A-Z2-7= (often lots of = padding)
- Check for Ascii85/Base85: dense punctuation; sometimes wrapped in
<~ ~>
Check for compression
If output almost parses but looks like garbage, suspect compression:
Look for magic bytes:
- gzip:
1f 8b
- zlib: often
78 01/9c/da
- zip:
50 4b 03 04
- bzip2:
42 5a 68 (BZh)
- xz:
fd 37 7a 58 5a 00
- zstd:
28 b5 2f fd
Use the detect_compression.sh script to check automatically.
Check for hashes
If you have a fixed-length string that looks like a hash:
- Google the hash (surprisingly effective)
- Try online lookup services:
Step 2: Classical Cipher Analysis
Substitution / monoalphabetic
Caesar / ROT / Atbash
Vigenère
Bacon cipher
Often appears as groups of 5 bits or 5 letters:
00111 01101 01010 00000 ...
AABBB ABBAB ABABA AAAAA ...
Morse
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
Runes
Runes are frequently substitution alphabets; search for "futhark cipher" and try mapping tables.
Step 3: Modern Crypto Constructs
Fernet
Typical hint: Two Base64 strings (token + key).
Shamir Secret Sharing
If you see multiple shares and a threshold t is mentioned, it is likely Shamir.
OpenSSL salted formats
CTFs sometimes give openssl enc outputs (header often begins with Salted__).
Bruteforce helpers:
Step 4: Advanced Tools
General toolset
Automated decoding
Online helpers
Practice platforms
Recommended Local Setup
Install these packages for a practical CTF stack:
pip install pycryptodome gmpy2 sympy pwntools z3-solver
Tools to have available:
- Python +
pycryptodome for symmetric primitives and fast prototyping
- SageMath for modular arithmetic, CRT, lattices, and RSA/ECC work
- Z3 for constraint-based challenges (when the crypto reduces to constraints)
Workflow Summary
- Triage: Identify type, classify, determine what's controlled
- Peel layers: Try encodings, check compression, look up hashes
- Classical: Try substitution, Caesar, Vigenère, Bacon, Morse
- Modern: Check Fernet, Shamir, OpenSSL formats
- Advanced: Use RsaCtfTool, lattices, Z3 when needed
- Verify: Test your solution against the challenge requirements
Tips
- Always try the simplest explanation first (encoding before encryption)
- Layered transforms are common - keep peeling until you get plaintext
- Use CyberChef's "Magic" function for quick identification
- When stuck, look for patterns: repeated blocks suggest XOR or ECB mode
- Nonce/IV reuse is a common vulnerability - check for it
- Oracle attacks (padding, timing, error) are powerful when available
- Don't forget to check for compression after decoding
1---2name: crypto-ctf-workflow3description: Use this skill whenever you encounter cryptography challenges, CTF crypto problems, encoded data, hashes, ciphers, or any security-related encryption/decryption tasks. Make sure to use this skill for any crypto CTF challenge, encoded strings, hash analysis, cipher breaking, or when you need to identify and peel layers of encoding/encryption.4---56# Crypto CTF Workflow78A systematic approach to solving cryptography challenges in CTFs and security tasks.910## Quick Triage Checklist1112When you encounter a crypto challenge, work through these steps in order:13141. **Identify what you have**: Is it encoding, encryption, hash, signature, or MAC?152. **Determine what is controlled**: Do you have plaintext/ciphertext, IV/nonce, key, oracle (padding/error/timing), or partial leakage?163. **Classify the type**:17 - Symmetric (AES/CTR/GCM)18 - Public-key (RSA/ECC)19 - Hash/MAC (SHA/MD5/HMAC)20 - Classical (Vigenere/XOR/Caesar)214. **Apply highest-probability checks first**: Decode layers, known-plaintext XOR, nonce reuse, mode misuse, oracle behavior225. **Escalate to advanced methods only when required**: Lattices (LLL/Coppersmith), SMT/Z3, side-channels2324## Step 1: Initial Identification2526### Check for common encodings first2728Many CTF crypto tasks are layered transforms: base encoding + simple substitution + compression. Start by peeling layers:2930**Try these in order:**311. Run the `identify_encoding.sh` script on your input322. Check for Base64: `A-Za-z0-9+/=` (padding `=` is common)333. Check for Base32: `A-Z2-7=` (often lots of `=` padding)344. Check for Ascii85/Base85: dense punctuation; sometimes wrapped in `<~ ~>`3536### Check for compression3738If output almost parses but looks like garbage, suspect compression:3940**Look for magic bytes:**41- gzip: `1f 8b`42- zlib: often `78 01/9c/da`43- zip: `50 4b 03 04`44- bzip2: `42 5a 68` (`BZh`)45- xz: `fd 37 7a 58 5a 00`46- zstd: `28 b5 2f fd`4748Use the `detect_compression.sh` script to check automatically.4950### Check for hashes5152If you have a fixed-length string that looks like a hash:53541. Google the hash (surprisingly effective)552. Try online lookup services:56 - https://crackstation.net/57 - https://md5decrypt.net/58 - https://hashes.org/search.php59 - https://www.onlinehashcrack.com/60 - https://gpuhash.me/61 - http://hashtoolkit.com/reverse-hash6263## Step 2: Classical Cipher Analysis6465### Substitution / monoalphabetic6667- Use Boxentriq cryptogram solver: https://www.boxentriq.com/code-breaking/cryptogram68- Use quipqiup: https://quipqiup.com/6970### Caesar / ROT / Atbash7172- Use Nayuki auto breaker: https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript73- Atbash: http://rumkin.com/tools/cipher/atbash.php7475### Vigenère7677- https://www.dcode.fr/vigenere-cipher78- https://www.guballa.de/vigenere-solver7980### Bacon cipher8182Often appears as groups of 5 bits or 5 letters:83```8400111 01101 01010 00000 ...85AABBB ABBAB ABABA AAAAA ...86```8788### Morse8990```91.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-92```9394### Runes9596Runes are frequently substitution alphabets; search for "futhark cipher" and try mapping tables.9798## Step 3: Modern Crypto Constructs99100### Fernet101102**Typical hint**: Two Base64 strings (token + key).103104- Decoder/notes: https://asecuritysite.com/encryption/ferdecode105- In Python: `from cryptography.fernet import Fernet`106107### Shamir Secret Sharing108109If you see multiple shares and a threshold `t` is mentioned, it is likely Shamir.110111- Online reconstructor (handy for CTFs): http://christian.gen.co/secrets/112113### OpenSSL salted formats114115CTFs sometimes give `openssl enc` outputs (header often begins with `Salted__`).116117Bruteforce helpers:118- https://github.com/glv2/bruteforce-salted-openssl119- https://github.com/carlospolop/easy_BFopensslCTF120121## Step 4: Advanced Tools122123### General toolset124125- **RsaCtfTool**: https://github.com/Ganapati/RsaCtfTool126- **featherduster**: https://github.com/nccgroup/featherduster127- **cryptovenom**: https://github.com/lockedbyte/cryptovenom128129### Automated decoding130131- **Ciphey**: https://github.com/Ciphey/Ciphey132- **python-codext** (tries many bases/encodings): https://github.com/dhondta/python-codext133134### Online helpers135136- **CyberChef** (magic, decode, convert): https://gchq.github.io/CyberChef/137- **dCode** (ciphers/encodings playground): https://www.dcode.fr/tools-list138- **Boxentriq** (substitution solvers): https://www.boxentriq.com/code-breaking139140### Practice platforms141142- **CryptoHack** (hands-on crypto challenges): https://cryptohack.org/143- **Cryptopals** (classic modern crypto pitfalls): https://cryptopals.com/144145## Recommended Local Setup146147Install these packages for a practical CTF stack:148149```bash150pip install pycryptodome gmpy2 sympy pwntools z3-solver151```152153**Tools to have available:**154- Python + `pycryptodome` for symmetric primitives and fast prototyping155- SageMath for modular arithmetic, CRT, lattices, and RSA/ECC work156- Z3 for constraint-based challenges (when the crypto reduces to constraints)157158## Workflow Summary1591601. **Triage**: Identify type, classify, determine what's controlled1612. **Peel layers**: Try encodings, check compression, look up hashes1623. **Classical**: Try substitution, Caesar, Vigenère, Bacon, Morse1634. **Modern**: Check Fernet, Shamir, OpenSSL formats1645. **Advanced**: Use RsaCtfTool, lattices, Z3 when needed1656. **Verify**: Test your solution against the challenge requirements166167## Tips168169- Always try the simplest explanation first (encoding before encryption)170- Layered transforms are common - keep peeling until you get plaintext171- Use CyberChef's "Magic" function for quick identification172- When stuck, look for patterns: repeated blocks suggest XOR or ECB mode173- Nonce/IV reuse is a common vulnerability - check for it174- Oracle attacks (padding, timing, error) are powerful when available175- Don't forget to check for compression after decoding