¿Puedo generar una clave aleatoria de 32 bits usando el código de hash de Java y las palabras en inglés aleatorias?

4

Quiero generar y comunicar una clave de 32 bits a Bob a través de una conversación telefónica. Sé que tiene el mismo sistema operativo y Java instalado que yo.

Supongamos que tengo un diccionario de 100,000 palabras (en inglés). ¿Puedo seleccionar dos palabras al azar de manera uniforme, concatenarlas y así ejecutar hashCode(word1 + word2) sin pérdida de entropía para que pueda generar fácilmente el mismo código?

Como una pregunta de seguimiento, ¿puedo entonces, si quiero una clave de 64 bits, simplemente seleccionar cuatro palabras y concatenar las claves hashCode(word1 + word2) con hashCode(word3 + word4) etc.?

Edit: Ps: 100,000 2 > 2 32 si mi cálculo es correcto.

    
pregunta Pål GD 08.03.2016 - 21:23
fuente

1 respuesta

5

En pocas palabras: no funcionará bien.

En palabras más largas: el método String.hashCode() de Java tiene sesgos; funciona multiplicando repetidamente un estado de ejecución por 31, luego agregando el valor numérico del siguiente carácter. El uso de las letras en inglés está sesgado, los grupos de letras están sesgados y se mostrarán. En otras palabras, pierdes algo de entropía.

Podría decirse que repasar una lista de palabras es algo muy extraño. Para elegir una palabra aleatoria en una lista de 100000 palabras, debe tener una forma de uniformemente obtener un número en el rango de 0 a 99999. ¿Por qué, oh, por qué, no utilizarías ese valor directamente? ¿Por qué convertir los números en palabras, y luego esperar que el método hashCode() los convierta de nuevo en números sin perder demasiada entropía en el proceso, en lugar de usar los números directamente?

Si puedes generar un entero uniforme en el rango 0..65535, entonces ... eso es todo. Tienes un entero de 16 bits aleatorio perfectamente fino. Genere dos de ellos, desplace uno de ellos en 16 bits, combínelo con bitwise OR (o con una adición) y listo.

También , una clave de 32 bits es atrozmente débil, por naturaleza, ya que puede tener solo 2 valores posibles 32 , cuya enumeración exhaustiva es muy sencilla. Una PC no tan poderosa. Estas bestias cuentan el tiempo en gigahertz.

    
respondido por el Thomas Pornin 08.03.2016 - 21:34
fuente

Lea otras preguntas en las etiquetas