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:

  1. SubBytes — S-box 8×8 (inversão em GF(2^8) + transformação afim).
  2. ShiftRows — rotação cíclica de cada linha do state 4×4.
  3. MixColumns — multiplicação matricial em GF(2^8) (omitida no último round).
  4. 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.