2011-01-12 10 views
6

Necesito crear una almohadilla de una sola vez para encriptar algunos datos (unos pocos KB de tamaño). ¿Cómo debo generar este pad de una sola vez para evitar todos los problemas pseudoaleatorios asociados con la generación de números aleatorios básicos como rand()?Almohadilla de una sola vez perfectamente aleatoria para encriptación

¿Existe alguna herramienta o biblioteca confiable que pueda usar para esto?

+0

¿Qué idioma/sistema operativo/entorno de tiempo de ejecución está utilizando? –

+1

busque aquí un par de buenas soluciones: http://stackoverflow.com/questions/3436376/what-is-the-most-secure-seed-for-random-number-generation –

+0

@Erik, no importa demasiado mucho. Preferiblemente Windows, sin embargo. –

Respuesta

4

Probar Random.ORG. Tienen varios servicios gratuitos (y pagos) que generan números verdaderamente aleatorios basados ​​en el ruido atmosférico (o al menos eso es lo que dicen hacer).

+0

Esto parece prometedor. –

+8

Siempre y cuando no te importe que alguien más conozca tu súper secreto pad de una sola vez. Y no te importa que tus atacantes sean capaces de interceptarlo por el cable. –

5

La mayoría de los sistemas operativos modernos tienen un cryptographically-secure pseudo-random number generator.

Por ejemplo, Windows tiene CryptGenRandom. Puede acceder al mismo flujo desde .NET utilizando la clase RNGCryptoServiceProvider. Desde C++, puede acceder al mismo flujo utilizando la función de biblioteca Microsoft C++ rand_s. Desde Python, se puede acceder usando la función urandom (ver la parte inferior de la página enlazada) en el módulo os.

A diferencia de los PRNG normales, los CSPRNG están diseñados para pasar rigurosas pruebas de aleatoriedad estadística. También están diseñados para resistir bien bajo un ataque serio, incluso cuando su estado inicial o de ejecución está disponible para un atacante.

El término "pseudoaleatorio", tal como lo usan los criptógrafos, puede ser engañoso para un lector no técnico. Un CSPRNG expande una colección de valores aleatorios, conocida como semilla, en una secuencia más larga de números. Esa secuencia es reproducible dada la semilla, pero para cualquier buen CSPRNG, un cambio menor en la semilla produce una secuencia muy diferente. Por lo tanto, siempre que al menos una parte de la semilla se elija mediante un proceso adecuadamente aleatorio, un atacante no puede predecir la secuencia resultante, incluso si el atacante puede influir en el resto de la semilla.

Numerosos sistemas importantes, que van desde las comunicaciones militares hasta el cifrado que protege prácticamente todas las transacciones en línea, se basan en la seguridad funcionalmente equivalente entre "pseudoaleatorio criptográficamente seguro" y "aleatorio".

EDIT: Si tiene la suerte de estar trabajando con la gama de procesadores Ivy Bridge de Intel, ahora tiene another very interesting alternative.

4

No puede generar números verdaderamente aleatorios de forma algorítmica; necesita asistencia de hardware. Si utiliza un algoritmo, por más seguro (como un PRNG criptográficamente seguro), simplemente está creando un cifrado de flujo basado en ese PRNG; ya no es un One Time Pad.

+2

@Nick: Si bien usar un PNRG criptográficamente seguro para una almohadilla de una sola vez no es lo mismo que usar un verdadero RNG, los dos métodos son casi idénticos en fuerza. No se llama "seguro criptográficamente" para nada. Y me gusta la cita de Steve Bellovin: "He observado que los blocs de una sola vez son teóricamente irrompibles, pero prácticamente muy débiles. Por el contrario, los sistemas de cifrado convencionales son teóricamente frágiles, pero prácticamente fuertes". – RoadWarrior

+2

No, no son "casi idénticos en fuerza". Una OTP real, utilizada correctamente, es literalmente irrompible, ya que todos los textos planos son igualmente probables. En contraste, un PRNG criptográficamente seguro tiene un estado mucho más limitado.Es casi seguro que el OP realmente desee un cifrado convencional (los OTP rara vez son la respuesta correcta), pero el simple hecho de decir "use un PRNG" es un mal consejo: simplemente está inventando su propio cifrado basado en el PRNG, y estaría mucho mejor apagado utilizando un cifrado existente. –

+2

No existe una "OTP real" garantizada. La seguridad se define solo en relación con un modelo de ataque. Por ejemplo, un circuito de hardware para producir bits subvertidos se puede construir en un circuito integrado de unos pocos milímetros cuadrados. El generador de números aleatorios de hardware más sofisticado puede subvertirse colocando dicho chip en cualquier lugar aguas arriba de donde se digitaliza la fuente de aleatoriedad, por ejemplo, en un chip de controlador de salida o incluso en el cable que conecta el RNG a la computadora. – RoadWarrior

Cuestiones relacionadas