Institución Universitaria de Envigado
SIO0010 · Técnicas Criptográficas · Laboratorio 1 · Sesión 1

Demostraciones y ejercicios

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.

Antes de empezar. No se evalúa que resuelvan los retos. Se evalúa que expliquen qué propiedad del cifrado permitió el ataque. Un ejercicio resuelto sin esa explicación vale la mitad.
Demostración 1

El mismo algoritmo, dos modos

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.

Original
sin cifrar
AES-256
modo ECB
AES-256
modo CBC
¿Por qué el escudo sobrevive al cifrado en ECB?

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.

Ejercicio 1 · 10 minutos

Un desplazamiento

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.

Texto cifrado
Desplazamiento: 0
Resultado
Qué hay que anotar en el informe

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.

Ejercicio 2 · 20 minutos

Una sustitución

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.

Texto cifrado
Frecuencia de cada símbolo en el texto cifrado
Pase el cursor por encima para ver el porcentaje
Frecuencia aproximada del español
Letra%Letra%
E13,7R6,9
A12,5N6,7
O8,7I6,2
S8,0D5,9
L5,0C4,7
Escriba debajo de cada símbolo del texto cifrado la letra que cree que le corresponde
Texto en claro según su correspondencia
Cómo se ataca esto, paso a paso

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.

Ejercicio 3 · 15 minutos

Dos mensajes, una misma llave

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.

Texto cifrado 1 · hexadecimal
Texto cifrado 2 · hexadecimal
Resultado de combinarlos
Por qué la llave desaparece

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.

Demostración 2

De dónde sale una llave

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.

Pulse un botón…
Las dos primeras líneas nunca se repiten. La tercera es siempre la misma, en esta máquina y en cualquier otra.
Por qué el tercer botón siempre da lo mismo

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.

Compare la entropía de distintos orígenes
Origen de la llaveEntropía realIntentos necesarios
Un PIN de 4 dígitosunos 13 bits10.000
Una palabra del diccionariounos 15 bitsdecenas de miles
«Cb4rr4-2023-HMAC-k3y»cero, una vez publicada1 · está dentro de la aplicación
Contraseña humana de 8 caracteres25 a 30 bits en la prácticahoras con una tarjeta gráfica
32 bytes de un generador sembrado con la horaunos 17 bits86.400 · menos de un segundo
32 bytes del generador de arriba256 bitsinalcanzable con tecnología clásica
La entropía no la da la longitud del texto, sino lo que el adversario no sabe. Una llave de veinte caracteres publicada vale menos que un PIN.
Repaso · 5 minutos

¿Qué servicio falló?

Seis situaciones. En algunas falló más de un servicio, y en tres no falló ninguno.