56. Probabilidad aplicada a criptografía

La criptografía usa conceptos probabilísticos para generar claves, medir incertidumbre, evitar patrones y analizar la posibilidad de colisiones. En seguridad, una pequeña debilidad probabilística puede convertirse en un ataque práctico.

56.1 Criptografía y azar

Un sistema criptográfico debe ocultar información incluso cuando el atacante conoce el algoritmo. La incertidumbre debe provenir de claves y valores aleatorios suficientemente impredecibles.

ClaveSecreto que controla una transformación.
EntropíaMedida de incertidumbre disponible.
ColisiónDos entradas con la misma salida hash.
RiesgoProbabilidad de que una debilidad sea explotable.

56.2 Espacio de claves

Si una clave tiene L posiciones y cada posición puede tomar A símbolos, hay AL claves posibles:

N=AL   ·   bits de información=L log2(A)

Un espacio grande dificulta la búsqueda exhaustiva, siempre que las claves se elijan de forma impredecible y el algoritmo no tenga debilidades.

56.3 Entropía

Para una variable discreta con probabilidades pi, la entropía de Shannon es:

H(X)=−Σ pi log2(pi)

La entropía es máxima cuando todos los resultados son equiprobables. Una contraseña elegida por una persona puede tener muchas menos posibilidades efectivas que su longitud aparente.

56.4 Generadores seguros

La aleatoriedad usada para claves, tokens y nonces debe provenir de un generador criptográficamente seguro. Un generador estadísticamente uniforme puede seguir siendo predecible si se conoce su estado.

En JavaScript, Math.random() sirve para demostraciones, no para secretos. Para contextos compatibles se debe usar una API criptográfica como crypto.getRandomValues().

56.5 Hashes y colisiones

Una función hash transforma una entrada de longitud arbitraria en una salida de longitud fija. Como hay infinitas entradas y un número finito de salidas, necesariamente existen colisiones.

entrada A≠entrada B, pero hash(A)=hash(B)

Un hash criptográfico busca que encontrar una colisión sea computacionalmente difícil, no que sea matemáticamente imposible.

56.6 Paradoja del cumpleaños

Si se generan valores uniformes en un espacio de M posibilidades, la probabilidad de que aparezca al menos una colisión después de n valores es:

P(colisión)=1−(M/M)·((M−1)/M)···((M−n+1)/M)

La probabilidad crece aproximadamente cuando n es del orden de √M. Por eso las longitudes de hash deben considerar ataques de cumpleaños.

56.7 Sal y contraseñas

Una sal aleatoria y única se combina con cada contraseña antes de almacenarla mediante una función de derivación lenta. La sal no necesita ser secreta: evita que dos usuarios con la misma contraseña tengan el mismo resultado y dificulta tablas precalculadas.

La sal no reemplaza una función de derivación adecuada ni convierte una contraseña débil en una contraseña fuerte.

56.8 Nonce, IV y reutilización

Algunos protocolos necesitan valores únicos o impredecibles, llamados nonces o vectores de inicialización. Reutilizarlos de manera incorrecta puede revelar relaciones entre mensajes o romper garantías de seguridad.

Las condiciones exactas dependen del modo criptográfico; no basta con elegir cualquier número aleatorio.

56.9 Criptografía en JavaScript

El siguiente ejemplo ilustra cómo obtener bytes aleatorios con la API del navegador. No implementa un sistema criptográfico completo:

function bytesAleatorios(cantidad) {
  const bytes = new Uint8Array(cantidad);
  crypto.getRandomValues(bytes);
  return Array.from(bytes);
}

console.log(bytesAleatorios(8));

Pulsa Ejecutar en un navegador compatible. Para aplicaciones reales deben usarse bibliotecas y protocolos revisados.

56.10 Laboratorio de colisiones

Simula identificadores uniformes y observa cómo aumenta la probabilidad de una colisión al crecer la cantidad de identificadores. El experimento es una versión didáctica de la paradoja del cumpleaños.

Colisiones en un espacio finito

Colisiones aleatoriasProbabilidad simulada de una colisión.

56.11 Probabilidad de adivinar una clave

Si todas las claves de un espacio de tamaño N son igualmente probables y se prueban k claves distintas, la probabilidad de acertar es k/N. El cálculo cambia si las claves no son uniformes o si el atacante puede priorizar elecciones comunes.

P(acierto en k intentos)=k/N, si k≤N y las elecciones son uniformes

56.12 Autenticación y tokens

Un token de sesión debe ser difícil de adivinar y, en muchos diseños, también debe expirar y quedar invalidado después de su uso. La longitud y la entropía efectiva determinan la dificultad de adivinación.

Codificar un token en hexadecimal o Base64 cambia su representación, no aumenta automáticamente la entropía.

56.13 Seguridad probabilística

Muchas garantías se expresan como “la probabilidad de éxito del atacante es despreciable”. Para evaluar esa afirmación hay que considerar número de intentos, tiempo, información filtrada, independencia y capacidad de cómputo.

56.14 Aplicaciones

La probabilidad aparece en generación de claves, protocolos de autenticación, firmas digitales, funciones hash, salting de contraseñas, tokens, selección de nonces, detección de fraude y análisis de ataques.

56.15 Errores frecuentes

  • Usar Math.random() para generar secretos.
  • Confundir longitud textual con entropía real.
  • Creer que las colisiones de un hash son imposibles.
  • Reutilizar un nonce o vector de inicialización cuando el protocolo lo prohíbe.
  • Guardar contraseñas con un hash rápido y sin sal.
  • Implementar criptografía propia sin revisión especializada.

56.16 Qué debes recordar y conclusión

H(X)=−Σpilog2(pi)
P(acierto)=intentos/espacio, bajo uniformidad
P(colisión) crece alrededor de n≈√M

La criptografía depende de la incertidumbre correcta: claves impredecibles, valores bien utilizados y análisis de colisiones. La probabilidad permite cuantificar riesgos, pero la seguridad práctica requiere protocolos y herramientas revisados.

Volver al índice