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:

  1. *ubBytes*— S-box 8×8 (inversão em GF(2^8) + transformação afim).
  2. *hiftRows*— rotação cíclica de cada linha do state 4×4.
  3. *ixColumns*— multiplicação matricial em GF(2^8) (omitida no último round).
  4. *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.
  • *idechannel* 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 autodetect 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 Sboxes keydependent.
*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.
*AST128 / CAST256* 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 (*ncryptthenMAC*.

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 192bit 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 192bit (randomsafe).
  • *ChaCha20* hashlike 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 *haCha20Poly1305*(universal) ou *ES256GCM*(com AESNI)
Disk encryption *ES256XTS*(LUKS2 default)
Encryption determinística (envelope) *ESGCMSIV*
Hardware sem AES-NI *haCha20-Poly1305*
Streaming muito longo *ChaCha20-Poly1305*(random nonce safe)
TLS handshake TLS 1.3 com ChaCha20Poly1305 ou AES128-GCM
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*— DJBschool 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) — altoní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.

Source: ../home/koder/dev/koder/meta/docs/cryptography/compendium/04-simetrica.md