miércoles, 11 de marzo de 2009

[Criptografia] Números Aleatorios

Cuando uno investiga un poco sobre criptografía, se da cuenta de que una de las cosas que hacen falta para que tu sistema de encriptado (criptosistema) sea seguro, es poder generar valores aleatorios.Esto para un programador no supone ningún problema, salvo que debe tener en cuenta algunos detalles.

Por ejemplo, todos los que programen en C/C++ conoceran la función "rand", que genera un número aleatorio a partir de una semilla. Pasemos a describir qué es lo que hace esta función en concreto:

- En la primera llamada a rand se le pasa una semilla X0 y devuelve un X1 = (a * X0 + b) mod c.
- Para la siguiente llamada a rand, cogería X1 como semilla para calcular X2.
- Y así hasta que nosotros queramos.

Pero esta función tiene un problema, si en algún momento de Xi tienen el mismo valor, se repetiría la cadena. Es decir, podría darse el caso en el que todos los Xi valiesen lo mismo...¡Qué aleatorio!. Por ejemplo, si cogiéramos (a,b,c,X0) = (2,3,7,4) haría lo siguiente:

- X1 = (2 * X0 + 3) mod 7 = (2 * 4 + 3) mod 7 = 11 mod 7 = 4
- X2 = (2 * X1 + 3) mod 7 = (2 * 4 + 3) mod 7 = 11 mod 7 = 4
- ... (así hasta el infinito y mas allá...)

Con esto conseguiríamos una sucesión de números "aleatorios": [4,4,...,4]. Todos iguales.

Esto es un caso extremo, pero sirve para demostrar que esa función no produce números precisamente aleatorios, utilizan un patrón predecible.

Pero no hay que desesperar, existen alternativas con las que podemos conseguir unas sucesiones de números aleatorios criptográficamente aceptables, es decir, que aunque no sean totalmente aleatorios, se acercan lo suficiente para considerarlos como tal. Estos generadores suelen venir implementados en las librerías de desarrollo de los distintos lenguajes de programación.

Links relacionados:
- Pseudo-aleatorios vs Alatorios:
Muestra dos imágenes que muestran el efecto de no disponer de números verdaderamente aleatorios.
- Un libro muy curioso:
Un libro en el que encontramos un millon de dígitos aleatorios.

No hay comentarios: