04 simetrica
04 — Criptografia Simétrica
Mesma chave para encrypt e decrypt. Categorizada em *lock ciphers*(operam em blocos fixos) e *tream 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
*eistel 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.
*ubstitution-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.
*RX (AddRotateXOR)*
- 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
*IPS 46*(1977), originado do *ucifer*da IBM (Feistel + Coppersmith). Bloco *4 bits* chave *6 bits*(8 bits de paridade), *6 rounds Feistel*
*uebra*
- 1990: Eli Biham + Adi Shamir descobrem *riptanálise diferencial*(NSA já sabia em 1974 — DES projetado pra resistir, S-boxes ajustadas).
- 1993: Mitsuru Matsui — *riptanálise linear* 2^43 plaintexts.
- 1997: distributed.net quebra DES Challenge I em 96 dias.
- 1998: *FF Deep Crack*— US$ 250k de hardware quebra DES em 22 horas.
- 1999: DES Challenge III em 22 horas (Deep Crack + distributed.net).
*tatus* 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\)).
- *
key 3DES* 168 bits de chave, *12 bits*de segurança efetiva (devido a meetinthemiddle). - *-key 3DES* 112 bits, ~80 bits efetivos.
*tatus* deprecated NIST após 2023 (SP 800131A); proibido em FIPS 1403 a partir de 2024. Vulnerável a *weet32*(CVE20162183) por bloco de 64 bits em modos CBC/CTR com >32 GB de tráfego.
3. AES (Advanced Encryption Standard) — 2001
NIST *IPS 197*(nov/2001). Algoritmo subjacente = *ijndael*(Joan Daemen + Vincent Rijmen, ganhador da competição AES 1997–2000 contra Serpent, Twofish, RC6, MARS).
*loco* 128 bits. *haves* 128 / 192 / 256 bits. *ounds* 10 / 12 / 14. *strutura* SPN com 4 operações por round:
- *ubBytes*— S-box 8×8 (inversão em GF(2^8) + transformação afim).
- *hiftRows*— rotação cíclica de cada linha do state 4×4.
- *ixColumns*— multiplicação matricial em GF(2^8) (omitida no último round).
- *ddRoundKey*— 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: *iclique cryptanalysis*(Bogdanov, Khovratovich, Rechberger 2011) — fator \(\sim 4\) melhor que brute force; impraticável.
- *ide
channel* cachetiming (Bernstein 2005, TromerOsvikShamir 2005) — mitigado por *ESNI*(Intel Westmere 2010), constanttime S-box (bitslicing).
Performance
- *ES-NI* ~1 cyclebyte em CPU moderna (IntelAMD desde 2010).
- *Arch64 Crypto Extensions* similar em ARM (Cortex-A57+).
- *oftware fallback*(T-tables ou bitsliced): 10–30 cycles/byte.
Implementações
- *eference C*em FIPS 197 appendix.
- *penSSL EVPaes_** com auto
detect AESNI. - *bedTLS AES*com hardware backend.
- *oringSSL 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 |
|---|---|---|---|
| *erpent* | 128 / 128–256 | Anderson + Biham + Knudsen, 1998 | AES finalist; 32 rounds; conservador, mais lento que AES. |
| *wofish* | 128 / 128–256 | Schneier + Kelsey + Whiting + Wagner + Hall + Ferguson, 1998 | AES finalist; Feistel com S |
| *lowfish* | 64 / 32–448 | Schneier, 1993 | Free, popular legacy; broken para volumes grandes (Sweet32). Sucessor Twofish. |
| *C5 / RC6* | variável | Rivest, 1994/1998 | RC6 foi AES finalist. |
| *AST |
64 / 40–128 ou 128 / 128–256 | Adams + Tavares | Usado em PGP. |
| *DEA* | 64 / 128 | Lai + Massey, 1991 | Usado em PGP 2.x; patenteado até 2012. |
| *amellia* | 128 / 128–256 | NTT + Mitsubishi, 2000 | Padrão ISO 18033-3; adoção JP/EU. |
| *RIA* | 128 / 128–256 | Korean standard, 2003 | |
| *M4* | 128 / 128 | Chinese GM/T 0002-2012 | Obrigatório em GB chinês. |
| *uznyechik* | 128 / 256 | Russian GOST R 34.12-2015 | Sucessor de GOST 28147. |
| *RESENT* | 64 / 80–128 | Bogdanov et al. 2007 | Lightweight, ISO 29192-2. |
| *PECK / SIMON* | variável | NSA 2013 | Lightweight; controvérsia por origem NSA. |
| *hreefish* | 2565121024 / mesmo | Schneier et al., 2008 | Block do Skein hash. ARX. Tweakable. |
| *SCON* | 128 / 128 | Dobraunig et al. 2014 | NIST lightweight crypto winner 2023. |
5. Modos de operação para block ciphers
Block cipher só cifra *m bloco* Modo aplica a mensagem arbitrária.
ECB (Electronic Codebook) ❌
Cada bloco cifrado independentemente: \(C_i = E_k(P_i)\).
*atastrófico*
- Plaintexts iguais geram ciphertexts iguais — *aza padrões* Famoso meme: pinguim Tux ECB-encrypted ainda mostra silhueta.
- Sem integridade.
- *ã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 *eve ser imprevisível*(não apenas único). IV preditível → *EAST*(2011).
- Não paralelizável em encryption (serial); paralelizável em decryption.
- Padding necessário (PKCS#7 padding). Padding ataques: *OODLE*(2014), *ucky 13*(2013).
- *em integridade* Vulnerável a tampering.
- Use apenas com MAC por cima (*ncrypt
thenMAC*.
CTR (Counter Mode) — 1979
\(C_i = P_i \oplus E_k(\text{nonce} \\\| i)\).
- Stream-like — nenhum padding necessário.
- *aralelizável*em encrypt e decrypt.
- Random access (decrypta qualquer bloco).
- *once 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 (XEXbased Tweakedcodebook with Ciphertext Stealing) — 2007
*EEE P1619* Para *isk 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
*EAD = 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 *P 80038D* *ESGCM*é padrão em TLS 1.2/1.3, IPsec, SSH.
- *ncrypt* AES-CTR.
- *uthenticate* GHASH (multiplicação em GF(2^128)).
- Tag de 128 bits (ou truncado, com cuidado).
- *ardware acceleration* PCLMULQDQ (Intel Westmere+).
*once reuse = catastrófico* revela authentication key (subkey \(H\)). *imite* 2^32 messages com mesma chave (96-bit nonce); birthday bound em GHASH.
*ecomendado* nonce *andom*96 bits, OK até ~2^32 mensagens; ou *ounter*96 bits para ordem determinística.
CCM (Counter with CBC-MAC) — 2003
NIST *P 80038C* Encrypt = CTR; MAC = CBCMAC. 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.
- *haCha20*stream cipher (ARX, 20 rounds).
- *oly1305*MAC (carry-save adders em GF(2^130 − 5)).
- Sem hardware acceleration necessária — rápido em *ualquer*CPU.
- Nonce 96 bits (variantes XChaCha20 com 192
bit nonce — randomsafe). - *onstant-time por design*
AESGCMSIV — RFC 8452 (2019)
Gueron + Lindell 2015. *oncemisuseresistant* 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 *eterministic*(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 *eystream*XORado com plaintext. Implementação: shift registers, ARX, ou modo de block cipher (CTR é streamlike).
RC4 ❌ — 1987 (broken)
Rivest 1987 (proprietary; leak para Cypherpunks 1994). Stream cipher simples, foi padrão de SSL/TLS por décadas.
*uebras*
- *luhrer, Mantin, Shamir*(2001) — vulnerabilidade em IV usada no WEP.
- *lFardan et al.*(2013) — biases recuperam plaintexts em milhões de conexões TLS.
- *OMORE*(2015) — biases práticos em ~75 horas de captura.
*tatus* removido de TLS (RFC 7465, 2015). *ão use em hipótese alguma*
Salsa20 / ChaCha20 — DJB 2005 / 2008
Bernstein. ARX, 20 rounds (Salsa20), 20 rounds (ChaCha20).
- *alsa20* eSTREAM portfolio winner (software profile).
- *haCha20* refinement, melhor diffusion, usado em TLS 1.3 / WireGuard.
- *Salsa20 / XChaCha20* variantes com nonce 192
bit (randomsafe). - *ChaCha20* hash
like construct usado para Xvariants.
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 *P 80038F* Encrypt key with key. Usa AES em construção específica. Determinístico (não usa IV), AEADlike.
- *ES-KW* input deve ser múltiplo de 8 bytes.
- *ES-KWP* padding for arbitrary length.
Uso: HSMs, KMS, envelope encryption (cloud key management).
Key derivation from key
*KDF*(RFC 5869) — extractthenexpand 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 | *haCha20 |
| Disk encryption | *ES |
| Encryption determinística (envelope) | *ES |
| Hardware sem AES-NI | *haCha20-Poly1305* |
| Streaming muito longo | *ChaCha20-Poly1305*(random nonce safe) |
| TLS handshake | TLS 1.3 com ChaCha20 |
| Mensageria E2E | ChaCha20-Poly1305 (Signal, WireGuard fazem) |
| Lightweight / IoT | *SCON-128a*(NIST LWC) |
| Pós-quântico symmetric | Use AES-256 (Grover só dá 128 bits de segurança) |
Anti-patterns
❌ ECB *unca* ❌ CBC sem MAC (EncryptthenMAC 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, IDEAcomchave-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
- *ibsodium*— DJB
school primitives; APIs misuseresistant. - *oringSSL / OpenSSL EVP*— TLS-grade primitives.
- *ge*(Filippo Valsorda) — file encryption com X25519 + ChaCha20-Poly1305 + scrypt.
- *ink*(Google) — high-level, keysets versionados.
- *hemis*(Cossack Labs) — alto
nível, multilanguage. - *ustcryptoaes-gcm* *ustcryptochacha20poly1305*— Rust constant-time.
- *yNaCl* *ryptography (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.