04 — Criptografia Simétrica
Mesma chave para encrypt e decrypt. Categorizada em block ciphers (operam em blocos fixos) e stream ciphers (operam bitbyte a bitbyte). Modos de operação aplicam block ciphers a mensagens arbitrárias. AEAD combina encryption + autenticação.
1. Block ciphers — princípios
Um block cipher é um par \((E, D)\) tal que \(E_k: \{0,1\}^n \to \{0,1\}^n\) é uma permutação para cada chave \(k \in \{0,1\}^\kappa\). Notação: \(n\) = block size em bits, \(\kappa\) = key size em bits.
Estruturas
Feistel network (Horst Feistel, IBM ~1971):
- Divide bloco em duas metades \(L, R\).
- Cada round: \(L' = R\), \(R' = L \oplus F(R, k_i)\) onde \(F\) é qualquer função (nem precisa ser invertível).
- Decryption = mesmas operações com round keys em ordem inversa.
- Exemplos: DES, 3DES, Blowfish, Twofish, CAST, Camellia, GOST 28147-89.
Substitution-Permutation Network (SPN):
- Cada round: AddRoundKey → SubBytes (S-box) → Permutation/Mix.
- Cifras precisam ser invertíveis (S-box bijetora; permutation invertível).
- Exemplos: AES, Serpent, PRESENT, SM4.
ARX (Add-Rotate-XOR):
- Operações: addition mod 2^n, bit rotation, XOR.
- Constant-time por design (sem table lookup).
- Exemplos: ChaCha20, Salsa20, Speck, Threefish.
2. DES (Data Encryption Standard) — 1977
FIPS 46 (1977), originado do Lucifer da IBM (Feistel + Coppersmith). Bloco 64 bits, chave 56 bits (8 bits de paridade), 16 rounds Feistel.
Quebra:
- 1990: Eli Biham + Adi Shamir descobrem criptanálise diferencial (NSA já sabia em 1974 — DES projetado pra resistir, S-boxes ajustadas).
- 1993: Mitsuru Matsui — criptanálise linear, 2^43 plaintexts.
- 1997: distributed.net quebra DES Challenge I em 96 dias.
- 1998: EFF Deep Crack — US$ 250k de hardware quebra DES em 22 horas.
- 1999: DES Challenge III em 22 horas (Deep Crack + distributed.net).
Status: chave de 56 bits inviável. Deprecated NIST.
3DES (Triple DES)
\(C = E_{k_3}(D_{k_2}(E_{k_1}(P)))\) — EDE pra compatibilidade com DES single (\(k_1 = k_2 = k_3\)).
- 3-key 3DES: 168 bits de chave, 112 bits de segurança efetiva (devido a meet-in-the-middle).
- 2-key 3DES: 112 bits, ~80 bits efetivos.
Status: deprecated NIST após 2023 (SP 800-131A); proibido em FIPS 140-3 a partir de 2024. Vulnerável a Sweet32 (CVE-2016-2183) por bloco de 64 bits em modos CBC/CTR com >32 GB de tráfego.
3. AES (Advanced Encryption Standard) — 2001
NIST FIPS 197 (nov/2001). Algoritmo subjacente = Rijndael (Joan Daemen + Vincent Rijmen, ganhador da competição AES 1997–2000 contra Serpent, Twofish, RC6, MARS).
Bloco: 128 bits. Chaves: 128 / 192 / 256 bits. Rounds: 10 / 12 / 14. Estrutura: SPN com 4 operações por round:
- SubBytes — S-box 8×8 (inversão em GF(2^8) + transformação afim).
- ShiftRows — rotação cíclica de cada linha do state 4×4.
- MixColumns — multiplicação matricial em GF(2^8) (omitida no último round).
- AddRoundKey — XOR com round key (expandida da master via key schedule).
Segurança
- Sem ataque prático contra AES "full rounds" depois de 25 anos de criptanálise pública.
- Melhor ataque conhecido: biclique cryptanalysis (Bogdanov, Khovratovich, Rechberger 2011) — fator \(\sim 4\) melhor que brute force; impraticável.
- Side-channel: cache-timing (Bernstein 2005, Tromer-Osvik-Shamir 2005) — mitigado por AES-NI (Intel Westmere 2010), constant-time S-box (bitslicing).
Performance
- AES-NI: ~1 cyclebyte em CPU moderna (IntelAMD desde 2010).
- AArch64 Crypto Extensions: similar em ARM (Cortex-A57+).
- Software fallback (T-tables ou bitsliced): 10–30 cycles/byte.
Implementações
- Reference C em FIPS 197 appendix.
- OpenSSL EVPaes*_* com auto-detect AES-NI.
- mbedTLS AES com hardware backend.
- BoringSSL aesni_* asm files.
Aplicações
- TLS 1.2/1.3 com cipher suites
_AES_128_GCM_/_AES_256_GCM_. - IPsec ESP
AES-GCM-16(RFC 4106). - LUKS2 default
aes-xts-plain64. - BitLocker, FileVault, dm-crypt, eCryptfs.
- WPA3 e WPA2 com CCMP.
4. Outros block ciphers relevantes
| Cipher | Bloco / Chave | Designer | Notas |
|---|---|---|---|
| Serpent | 128 / 128–256 | Anderson + Biham + Knudsen, 1998 | AES finalist; 32 rounds; conservador, mais lento que AES. |
| Twofish | 128 / 128–256 | Schneier + Kelsey + Whiting + Wagner + Hall + Ferguson, 1998 | AES finalist; Feistel com S-boxes key-dependent. |
| Blowfish | 64 / 32–448 | Schneier, 1993 | Free, popular legacy; broken para volumes grandes (Sweet32). Sucessor Twofish. |
| RC5 / RC6 | variável | Rivest, 1994/1998 | RC6 foi AES finalist. |
| CAST-128 / CAST-256 | 64 / 40–128 ou 128 / 128–256 | Adams + Tavares | Usado em PGP. |
| IDEA | 64 / 128 | Lai + Massey, 1991 | Usado em PGP 2.x; patenteado até 2012. |
| Camellia | 128 / 128–256 | NTT + Mitsubishi, 2000 | Padrão ISO 18033-3; adoção JP/EU. |
| ARIA | 128 / 128–256 | Korean standard, 2003 | |
| SM4 | 128 / 128 | Chinese GM/T 0002-2012 | Obrigatório em GB chinês. |
| Kuznyechik | 128 / 256 | Russian GOST R 34.12-2015 | Sucessor de GOST 28147. |
| PRESENT | 64 / 80–128 | Bogdanov et al. 2007 | Lightweight, ISO 29192-2. |
| SPECK / SIMON | variável | NSA 2013 | Lightweight; controvérsia por origem NSA. |
| Threefish | 2565121024 / mesmo | Schneier et al., 2008 | Block do Skein hash. ARX. Tweakable. |
| ASCON | 128 / 128 | Dobraunig et al. 2014 | NIST lightweight crypto winner 2023. |
5. Modos de operação para block ciphers
Block cipher só cifra um bloco. Modo aplica a mensagem arbitrária.
ECB (Electronic Codebook) ❌
Cada bloco cifrado independentemente: \(C_i = E_k(P_i)\).
Catastrófico:
- Plaintexts iguais geram ciphertexts iguais — vaza padrões. Famoso meme: pinguim Tux ECB-encrypted ainda mostra silhueta.
- Sem integridade.
- Não use. Cobertura legítima: derivar chave única / KDF building block.
CBC (Cipher Block Chaining) — 1976
\(C_i = E_k(P_i \oplus C_{i-1})\) com \(C_0 = \text{IV}\).
- IV deve ser imprevisível (não apenas único). IV preditível → BEAST (2011).
- Não paralelizável em encryption (serial); paralelizável em decryption.
- Padding necessário (PKCS#7 padding). Padding ataques: POODLE (2014), Lucky 13 (2013).
- Sem integridade. Vulnerável a tampering.
- Use apenas com MAC por cima (Encrypt-then-MAC).
CTR (Counter Mode) — 1979
\(C_i = P_i \oplus E_k(\text{nonce} \\\| i)\).
- Stream-like — nenhum padding necessário.
- Paralelizável em encrypt e decrypt.
- Random access (decrypta qualquer bloco).
- Nonce reuse = catastrófico: \(C_1 \oplus C_2 = P_1 \oplus P_2\).
- Sem integridade — use com MAC.
OFB / CFB
Variantes históricas, raramente usadas em design novo. CFB self-syncing (resistente a perda de bytes em transmissão); OFB tipo stream cipher.
XTS (XEX-based Tweaked-codebook with Ciphertext Stealing) — 2007
IEEE P1619. Para disk encryption. Cada setor é tweak. Encrypt-only (sem MAC porque disk não tem espaço extra).
- Plaintext rearranjado ou tamper: detectável só por aplicação (não por XTS).
- Mesma chave + mesmo setor + mesmo plaintext = mesmo ciphertext (deterministic).
- Usado em LUKS2, BitLocker, FileVault, Veracrypt.
- Não use pra mensagens; só pra storage.
6. AEAD — Authenticated Encryption with Associated Data
AEAD = encryption + integridade + autenticação + dados extras autenticados.
Interface canônica:
encrypt(key, nonce, plaintext, associated_data) → ciphertext, tag
decrypt(key, nonce, ciphertext, associated_data, tag) → plaintext or ⊥associated_data (AD) não é cifrado mas é autenticado — útil para headers de protocolo.
GCM (Galois/Counter Mode) — 2007
NIST SP 800-38D. AES-GCM é padrão em TLS 1.2/1.3, IPsec, SSH.
- Encrypt: AES-CTR.
- Authenticate: GHASH (multiplicação em GF(2^128)).
- Tag de 128 bits (ou truncado, com cuidado).
- Hardware acceleration: PCLMULQDQ (Intel Westmere+).
Nonce reuse = catastrófico: revela authentication key (subkey \(H\)). Limite: 2^32 messages com mesma chave (96-bit nonce); birthday bound em GHASH.
Recomendado: nonce random 96 bits, OK até ~2^32 mensagens; ou counter 96 bits para ordem determinística.
CCM (Counter with CBC-MAC) — 2003
NIST SP 800-38C. Encrypt = CTR; MAC = CBC-MAC. Mais lento que GCM (não paralelizável; duas passadas). Usado em WPA2 (CCMP), Zigbee, Bluetooth LE.
ChaCha20-Poly1305 — RFC 8439 (2018; antes RFC 7539)
DJB design. Padrão em TLS 1.3 (obrigatório), WireGuard, Signal Protocol.
- ChaCha20 stream cipher (ARX, 20 rounds).
- Poly1305 MAC (carry-save adders em GF(2^130 − 5)).
- Sem hardware acceleration necessária — rápido em qualquer CPU.
- Nonce 96 bits (variantes XChaCha20 com 192-bit nonce — random-safe).
- Constant-time por design.
AES-GCM-SIV — RFC 8452 (2019)
Gueron + Lindell 2015. Nonce-misuse-resistant: se nonce repete, vaza apenas equality de plaintexts (não chave inteira). Útil em cenários onde nonce uniqueness é difícil de garantir (estado distribuído, replay).
OCB3 — RFC 7253 (2014)
Rogaway. Single-pass AEAD, ~1.05 × CTR speed. Patente liberada para uso livre em 2013. Usado pouco devido a histórico de patente; tecnicamente excelente.
SIV (Synthetic IV) — RFC 5297 (2008)
Rogaway. Mais lento (duas passadas) mas deterministic (encrypt(P) = encrypt(P) — útil pra envelopes de chaves, key wrapping).
AEGIS — 2014
Wu + Preneel. Stream AEAD usando AES round function. Ganhador CAESAR competition (junto com ASCON, COLM, MORUS, ACORN, Deoxys-II) em 2018. Padronizado RFC draft 2024.
7. Stream ciphers
Geram keystream XOR-ado com plaintext. Implementação: shift registers, ARX, ou modo de block cipher (CTR é stream-like).
RC4 ❌ — 1987 (broken)
Rivest 1987 (proprietary; leak para Cypherpunks 1994). Stream cipher simples, foi padrão de SSL/TLS por décadas.
Quebras:
- Fluhrer, Mantin, Shamir (2001) — vulnerabilidade em IV usada no WEP.
- AlFardan et al. (2013) — biases recuperam plaintexts em milhões de conexões TLS.
- NOMORE (2015) — biases práticos em ~75 horas de captura.
Status: removido de TLS (RFC 7465, 2015). Não use em hipótese alguma.
Salsa20 / ChaCha20 — DJB 2005 / 2008
Bernstein. ARX, 20 rounds (Salsa20), 20 rounds (ChaCha20).
- Salsa20: eSTREAM portfolio winner (software profile).
- ChaCha20: refinement, melhor diffusion, usado em TLS 1.3 / WireGuard.
- XSalsa20 / XChaCha20: variantes com nonce 192-bit (random-safe).
- HChaCha20: hash-like construct usado para X-variants.
Snow 3G / Snow-V
3GPP usa Snow 3G em LTE/4G UEA2, UIA2. Snow-V proposto para 5G; perdeu para a outra família.
Trivium / Grain
eSTREAM hardware profile winners. Trivium tem state de 288 bits e é extremamente simples — usada em IoT.
KCipher-2
Padronizada no Japão. Pouco uso global.
8. Key derivation, key wrap, key management
Key Wrap (KW, KWP)
NIST SP 800-38F. Encrypt key with key. Usa AES em construção específica. Determinístico (não usa IV), AEAD-like.
- AES-KW: input deve ser múltiplo de 8 bytes.
- AES-KWP: padding for arbitrary length.
Uso: HSMs, KMS, envelope encryption (cloud key management).
Key derivation from key
HKDF (RFC 5869) — extract-then-expand baseado em HMAC. Standard moderno.
prk = HMAC(salt, ikm)
okm = HMAC(prk, info \\\| 0x01) \\\| HMAC(prk, okm[0] \\\| info \\\| 0x02) \\\| …Key derivation from password
Ver 06-hash-e-mac.md §KDFs. (Argon2id, scrypt, bcrypt, PBKDF2.)
9. Recomendações práticas 2026
| Necessidade | Use |
|---|---|
| Encryption simétrica geral | ChaCha20-Poly1305 (universal) ou AES-256-GCM (com AES-NI) |
| Disk encryption | AES-256-XTS (LUKS2 default) |
| Encryption determinística (envelope) | AES-GCM-SIV |
| Hardware sem AES-NI | ChaCha20-Poly1305 |
| Streaming muito longo | XChaCha20-Poly1305 (random nonce safe) |
| TLS handshake | TLS 1.3 com ChaCha20-Poly1305 ou AES-128-GCM |
| Mensageria E2E | ChaCha20-Poly1305 (Signal, WireGuard fazem) |
| Lightweight / IoT | ASCON-128a (NIST LWC) |
| Pós-quântico symmetric | Use AES-256 (Grover só dá 128 bits de segurança) |
Anti-patterns
❌ ECB nunca. ❌ CBC sem MAC (Encrypt-then-MAC obrigatório). ❌ Reusar nonce GCM com mesma chave. ❌ Padding oracles em CBC (sempre dê erro genérico em decrypt failure). ❌ Truncar tags GCM abaixo de 96 bits sem análise. ❌ Usar mesma chave para encryption e MAC (use HKDF para split). ❌ RC4, DES, 3DES, RC2, IDEA-com-chave-fraca. ❌ Chave fixada no código.
Tamanhos canônicos
| Componente | Bits |
|---|---|
| AES key | 256 |
| ChaCha20 key | 256 |
| GCM nonce | 96 |
| ChaCha20 nonce | 96 (ou 192 para XChaCha20) |
| GCM/Poly1305 tag | 128 |
| HKDF salt | 256 |
| Master key | 256 |
10. Bibliotecas auditadas
- libsodium — DJB-school primitives; APIs misuse-resistant.
- BoringSSL / OpenSSL EVP — TLS-grade primitives.
- age (Filippo Valsorda) — file encryption com X25519 + ChaCha20-Poly1305 + scrypt.
- Tink (Google) — high-level, keysets versionados.
- Themis (Cossack Labs) — alto-nível, multi-language.
- rustcrypto/aes-gcm, rustcrypto/chacha20poly1305 — Rust constant-time.
- PyNaCl, cryptography (pyca) — Python.
11. Referência cruzada
- Hash e MAC:
06-hash-e-mac.md. - Protocolos que aplicam (TLS, SSH, IPsec):
07-protocolos.md. - Ataques específicos (BEAST, POODLE, Lucky13, Sweet32):
11-ataques.md. - Pessoas (Daemen, Rijmen, DJB, Schneier, Rivest):
12-pessoas.md. - Konder Stack usage:
14-koder-aplicada.md.