Todo funciona sin conexión a internet y sin instalar nada: los cálculos ocurren en su navegador y no se envía información a ningún servidor. Ábralo con doble clic.
El escudo de la Institución, guardado como imagen y cifrado con AES-256 y una llave de 256 bits generada al azar. Solo se conservó la cabecera del archivo para poder abrirlo. Lo único que cambia entre las dos imágenes cifradas es el modo de operación.
El escudo tiene zonas grandes de un solo color. Cada zona uniforme produce bloques de entrada idénticos, y en ECB los bloques idénticos producen siempre la misma salida. El cifrado oculta el valor de cada píxel, pero no oculta qué bloques se repiten y dónde, y esa información basta para reconstruir la forma. En CBC cada bloque se encadena con el resultado del anterior, así que dos bloques iguales del original producen salidas distintas.
Dónde importa de verdad: no en imágenes, sino en bases de datos cifradas campo por campo, donde permite contar cuántos registros comparten un valor y deducir cuál es.
El siguiente mensaje está cifrado con el método de César: cada letra se desplazó un número fijo de posiciones. Nadie les dice cuántas. Encuéntrenlo.
Cuántos intentos hicieron falta y cuánto tiempo tomó. Y la pregunta de fondo: ¿por qué este cifrado es indefendible aunque nadie conozca la llave? La respuesta no es «porque es antiguo»: es porque el espacio de llaves tiene solo 25 opciones y se puede recorrer entero a mano.
Ahora cada letra fue reemplazada por otra cualquiera, no por un desplazamiento fijo. El espacio de llaves pasa de 25 a más de 4 × 10²⁶ posibilidades: cuatrocientos mil trillones de veces más grande. Y aun así va a caer en veinte minutos.
| Letra | % | Letra | % |
|---|---|---|---|
| E | 13,7 | R | 6,9 |
| A | 12,5 | N | 6,7 |
| O | 8,7 | I | 6,2 |
| S | 8,0 | D | 5,9 |
| L | 5,0 | C | 4,7 |
1 · Cuente la frecuencia de cada símbolo del texto cifrado y ordénelos de mayor a menor. 2 · Compárelos con la tabla del español: el símbolo más frecuente suele ser la E o la A. 3 · Busque palabras de una y dos letras, que en español son pocas: «y», «a», «el», «la», «de», «en», «un». 4 · Use terminaciones frecuentes como «-ción», «-ando», «-mente». 5 · A partir de tres o cuatro letras correctas, el resto sale por contexto.
La lección de este ejercicio es la más importante del bloque: un espacio de llaves enorme no sirve de nada si el cifrado conserva la estructura estadística del idioma. Un espacio de llaves grande es necesario, pero nunca suficiente.
Estos dos textos cifrados se produjeron combinando cada mensaje con la misma llave de flujo, byte a byte. La llave es perfectamente aleatoria y ustedes no la conocen ni la van a conocer. Combine los dos textos cifrados entre sí y observe qué pasa.
Si C1 = M1 ⊕ K y C2 = M2 ⊕ K, entonces C1 ⊕ C2 = M1 ⊕ M2. La llave se cancela consigo misma y queda una relación directa entre los dos mensajes en claro. A partir de ahí, conjeturar una parte de uno revela la parte correspondiente del otro.
Esto no es historia. Es la tercera condición del cuaderno de un solo uso, y el mismo error reaparece con AES cuando se repite el vector de inicialización o el contador, y con firma digital cuando se repite el número que debe ser único. Un solo error con tres disfraces.
Los dos primeros botones piden los bytes al generador criptográfico de su navegador. El tercero hace lo que hace random.seed(2019) en Python: los calcula con una fórmula que siempre arranca del mismo número. Pulse los tres varias veces y mire cuál se repite.
Un computador no inventa azar: calcula. Un generador sembrado aplica una fórmula a partir de un número inicial, la semilla. Misma semilla, misma secuencia, siempre, en cualquier computador y en cualquier momento. Eso no es un defecto: es para lo que existe. Si usted simula el tráfico de un cajero y necesita repetir el experimento idéntico, fija la semilla.
El otro generador no calcula el número: se lo pide al sistema operativo, que lo arma con entropía física —tiempos entre interrupciones, ruido del hardware, el generador de la CPU—. No hay fórmula que repetir, así que no hay manera de volver a obtener el mismo valor.
Por eso importa: una llave de 128 bits que sale de una fórmula no vale 128 bits. Vale lo que valga la semilla. Si el programador sembró con la hora del momento, son 86.400 semillas posibles —una por segundo del día— y probarlas todas toma menos de un segundo.
Esto ya pasó. En 2008 un parche a OpenSSL en Debian eliminó por error casi todas las fuentes de entropía de la semilla, que quedó dependiendo del identificador del proceso: unos 32.768 valores. Todas las llaves SSH y SSL generadas durante casi dos años se podían enumerar en una lista. El algoritmo era correcto, el tamaño de llave era correcto, la implementación era correcta. La semilla no.
Regla para revisar código: si en un archivo que genera llaves, tokens o contraseñas aparece import random, eso es un hallazgo. En Python se usa secrets; en el navegador, crypto.getRandomValues. Y ojo: random tampoco sirve aunque nunca se llame a seed() — sigue siendo una fórmula, y a quien vea suficientes salidas le basta para predecir todas las siguientes.
| Origen de la llave | Entropía real | Intentos necesarios |
|---|---|---|
| Un PIN de 4 dígitos | unos 13 bits | 10.000 |
| Una palabra del diccionario | unos 15 bits | decenas de miles |
| «Cb4rr4-2023-HMAC-k3y» | cero, una vez publicada | 1 · está dentro de la aplicación |
| Contraseña humana de 8 caracteres | 25 a 30 bits en la práctica | horas con una tarjeta gráfica |
| 32 bytes de un generador sembrado con la hora | unos 17 bits | 86.400 · menos de un segundo |
| 32 bytes del generador de arriba | 256 bits | inalcanzable con tecnología clásica |
Seis situaciones. En algunas falló más de un servicio, y en tres no falló ninguno.