Me preocupa que un SHA-1 PRNG no pueda producir una clave de cifrado AES-256 con los 256 bits de seguridad esperados, o incluso cualquier clave de cifrado segura donde se esperan más de 165 bits de seguridad.
El SHA-1 PRNG es el único generador de números aleatorios seguros de Java puro proporcionado por Java sin bibliotecas de terceros. (Soy plenamente consciente de que existen bibliotecas de terceros que ofrecen otros algoritmos). Se puede ver una implementación aquí . El algoritmo comienza con un estado que consiste en 160 bits extraídos de una fuente externa. A medida que el algoritmo utiliza estos datos, realiza un seguimiento de qué byte se utilizó por última vez, un número entre uno y veinte y que requiere otros 5 bits de información para representar.
Una vez que se han agotado los 160 bits, los siguientes 160 bits se obtienen calculando:
estado (n + 1) = estado (n) + SHA1 (estado (n)) + I (SHA1 (estado (n))
donde I (x) = 1 si x = 0 e I (x) = 0 si x! = 1
Esto está totalmente determinado por los 160 bits de estado existentes.
Esto significa que si le da a alguien 165 bits de información, puede calcular la salida del SHA-1 PRNG en cualquier momento futuro. Por lo tanto, si tengo un cifrado AES-256 y sé que la clave se generó usando SHA-1 PRNG, solo tengo que probar 2 ^ 165 combinaciones posibles, no 2 ^ 256. Esto parece debilitar significativamente el cifrado.
Como la ley de conservación de la información dice que la información nunca puede crearse, no veo la posibilidad de que un algoritmo cuyo estado interno consiste en solo 165 bits de información pueda generar 256 bits de información.
Si esto es cierto y el SHA-1 PRNG que se incluye con Java solo puede generar claves débiles, ¿qué debería hacer uno?
¿Existe un recurso que enumera la cantidad de bits de información que incorpora una función PRNG segura para que uno pueda asegurarse de que el algoritmo tenga más bits que la clave de cifrado?