Cifrado ChaCha20
Cifrado de flujo moderno con autenticación opcional
Seguridad del lado del cliente
ChaCha20-Poly1305 (RFC 8439) es el modo AEAD recomendado. ChaCha20 solo no ofrece integridad — siempre usar con Poly1305. Nonce 96 bits: unicidad estricta obligatoria. XChaCha20-Poly1305 (192 bits) para generación aleatoria segura.
Valor inicial del contador (predeterminado: 0)
Acerca de ChaCha20
ChaCha20 es un cifrado de flujo ARX de Bernstein (2008), variante mejorada de Salsa20. Misma matriz 4×4 pero quarter-round rediseñado con rotaciones 16-12-8-7: difusión completa en 2 rondas vs 4 de Salsa20. IETF (RFC 8439): nonce 96 bits + contador 32 bits (máx 256 GB/nonce).
ChaCha20-Poly1305 (RFC 7539→RFC 8439): AEAD estandarizado IETF. Clave Poly1305 derivada de los 32 primeros bytes ChaCha20 (contador=0), cifrado desde contador=1. Tag 128 bits. Google 2014 para Android TLS. TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 obligatorio.
Comparación de algoritmos
| Algoritmo | Autenticación | Longitud de clave | Tamaño del nonce | Caso de uso |
|---|---|---|---|---|
| ChaCha20 | Cifrado de flujo | 256 bits | 96 bits (12 bytes) | Investigación protocolo; streaming con autenticación en capa superior; benchmarking |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3, WireGuard, SSH, QUIC, Signal; dispositivos sin AES-NI; AEAD resistente a timing |
| XChaCha20 | Cifrado de flujo | 256 bits | 192 bits (24 bytes) | Cifrado archivos/DB sin unicidad nonce garantizada; libsodium secretstream; cifrado copias de seguridad |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | Datos en reposo con nonce aleatorio + 128 bits auth; almacenamiento libsodium; AEAD por defecto sin gestión central de nonce |
Cómo funciona ChaCha20
Inicialización 4×4: fila 0=constantes “expa nd 32-byte k”, filas 1-2=clave 256 bits (8×32), fila 3=[contador|nonce₀|nonce₁|nonce₂] (IETF). Quarter-round(a,b,c,d): a+=b; d^=a; d‹‹‹16; c+=d; b^=c; b‹‹‹12; a+=b; d^=a; d‹‹‹8; c+=d; b^=c; b‹‹‹7.
Ronda doble = quarter-round columnas + diagonales. Rotaciones 16-12-8-7: difusión completa en 2 rondas (Salsa20: 4 rondas). 10 rondas dobles; salida = XOR estado transformado con estado inicial.
AEAD: Cifrado autenticado
ChaCha20-Poly1305 (RFC 8439): clave Poly1305 one-time de los 32 primeros bytes ChaCha20 (contador=0); cifrado desde contador=1; MAC sobre [AAD relleno||cifrado relleno||len(AAD)||len(cifrado)]; tag 16 bytes.
XChaCha20-Poly1305: HChaCha20 deriva subclave 256 bits de los 128 primeros bits nonce 192 bits + clave original. 2^32 mensajes → probabilidad colisión 2^(-128). libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt.
Características principales
- Mejor difusión que Salsa20: rotaciones 16-12-8-7 → difusión completa en 2 rondas. ChaCha20/8 ≈ Salsa20/16 en seguridad.
- Estandarización IETF (RFC 8439, 2018): TLS 1.3, WireGuard, SSH, QUIC, Signal, Noise Protocol, Android TLS.
- Rendimiento sin AES-NI: 25-40% más rápido que AES-GCM en ARM, RISC-V, MIPS. Ideal IoT/móvil/embebido.
- Nonce 96 bits IETF: contador 32 bits (máx 256 GB/nonce). XChaCha20: 192 bits para generación aleatoria segura.
- Sin ataques conocidos a ChaCha20/20 (2025). Mejor análisis reducido: Shi et al. (2012) sobre ChaCha20/6.
Consideraciones de seguridad
- Reutilización nonce catastrófica en ChaCha20-Poly1305: XOR plaintexts expuesto + clave Poly1305 revelada. TLS 1.3: nonce XOR número de secuencia.
- Límite contador 32 bits: máx 256 GB por (clave, nonce). TLS 1.3 re-keying via key_update.
- Clave Poly1305 one-time: reutilización nonce → reutilización clave Poly1305 → ataque forgery (Bernstein 2005). RFC 8439 §2.8.
- Tag truncado prohibido: RFC 8439 exige 16 bytes. Truncación a 64 bits → 2^(-64), no conforme TLS 1.3.
Uso en el mundo real
- TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 obligatorio. OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLS.
- WireGuard VPN: único cifrado simétrico (Donenfeld 2017, Linux 5.6). Con Curve25519, Poly1305, BLAKE2, SipHash.
- Signal Protocol/Double Ratchet: ChaCha20-Poly1305 tras X3DH. WhatsApp, Messenger secreto, Matrix, Keybase.
- OpenSSH chacha20-poly1305@openssh.com (6.5, 2014): dos instancias ChaCha20 para eliminar fugas de temporización.
- Google Mobile TLS (2014): Langley+Duong. 3x más rápido que AES-128-GCM en Nexus 5 Cortex-A15. Influencia IETF.
Referencias
Herramientas Relacionadas
Cifrado/Descifrado AES
Cifrar y descifrar texto de forma segura usando el algoritmo AES
Familia RC (RC4/RC5/RC6)
Cifrados de flujo y bloque de la familia RC incluyendo RC4, RC4-Drop, RC5 y RC6 (finalista AES)
Cifrado/Descifrado Blowfish
Cifrado de bloques simétrico rápido diseñado por Bruce Schneier, con longitud de clave variable (32-448 bits)