SJCL: convierte ascii a BitArray y calcula números aleatorios

3

Estoy utilizando la biblioteca de criptografía Javascript de Stanford y me gustaría obtener más información al respecto.

1.) Tengo un texto ASCII y una clave aleatoria de 128 bits. Quiero concentrarme en esas dos cosas, así que convierto el texto ASCII en hexadecimal y luego en BitArray.
Ejemplo: var text="kheil" ; var textHex=asc2hex(text);var textBitArray= sjcl.codec.hex.toBits(textHex);
Obtengo el siguiente BitArray: 1802003817,8797904961536 .
Lo que me preocupa es el último número, ¿por qué es más largo? Es más que un número de 32 bits. Con algún texto ASCII, está bien que obtenga un BitArray con números de 32 bits, pero con algunos otros recibo este tipo de sufijo, ¿es normal? Y si lo concaten con un número aleatorio: -96822511,1783357814,2009621896,-1425360948 , obtengo: 1802003817,1828338331,292178913,1987561573,-2002056521,8795220606976 , lo cual no es una buena concatenación, ¿no? Supongo que el texto no es un múltiplo de 32 bits, pero ¿cómo obtener una buena BitArray para cualquier texto?

2.) También para calcular una clave aleatoria de 128 bits Yo uso sjcl.random.randomWord (4,0), ¿es una función eficiente calcular una clave aleatoria? Leí en alguna parte que no debería usar 0 como paranoia, o es necesario llamar a startCollector () para obtener la entropía. Estoy un poco confundido acerca de eso, ¿podría alguien explicarme eso?

¡Gracias!

    
pregunta Kheil 04.07.2013 - 01:52
fuente

2 respuestas

5

Sin mirar los números exactos, permítanme dar algunas sugerencias sobre por qué sucede esto:

  1. Según los documentos , a veces utilizará algunos bits adicionales para almacenar más información (a saber, el número real de bytes):

      

    La mayoría de nuestros primitivos criptográficos operan en matrices de palabras de 4 bytes internamente, pero muchas de ellas pueden tomar argumentos que no son un múltiplo de 4 bytes. Esta biblioteca codifica matrices de bits ( cuyo tamaño no necesita ser un múltiplo de 8 bits ) como matrices de palabras de 32 bits. Los bits están empaquetados, big-endian, en una serie de palabras, 32 bits a la vez. Como las palabras son números de punto flotante de doble precisión, se ajustan a algunos datos adicionales . Usamos esto (de una manera privada, posiblemente cambiante) para codificar el número de bits realmente presente en la última palabra de la matriz .

         

    Debido a que las operaciones a nivel de bits borran estos datos fuera de banda, estas matrices se pueden pasar a cifrados como AES que desean matrices de palabras.

    Eso probablemente explica el bit extra que se está agregando, y también explica por qué concatenar dos BitArray s no concatenará simplemente la palabra arrays, como parece que estás esperando. Si el primero tuviera un múltiplo de 4 bytes, entonces sí, eso es lo que sucedería.

  2. Si recuerdo correctamente, SJCL intentará usar la funcionalidad criptográfica de los navegadores modernos para crear su generador de números aleatorios, recurriendo a uno personalizado (que utiliza movimientos del mouse, pulsaciones de teclas, etc. para generar entropía adicional). combinarse con un PRNG [no criptográfico]. Eso significa que en el navegador moderno no es importante si establece paranoia o no. En los navegadores más antiguos (o en los que no admiten crypto ), realmente debe poner en funcionamiento los recopiladores si planea usar algoritmos que dependen de un CSPRNG. Te ayudaría más, pero nunca usé esa funcionalidad, así que solo puedo dirigirte a los documentos .

P.S. US-ASCII es un subconjunto de UTF-8, por lo que no necesita convertir primero a Hex y luego a BitArray. Solo usa sjcl.codec.utf8String.toBits(str) . (Pensándolo bien, ¿cómo sabe que su texto es realmente ASCII? SJCL [normalmente] se ejecuta en un navegador ... Es mejor estar seguro y hacer que su código sea compatible con Unicode)

    
respondido por el mgibsonbr 04.07.2013 - 05:29
fuente
0

La razón por la que BitArray contiene ints > 32bits es que codec.hex.toBits asume que la cadena hexadecimal suministrada tiene una longitud de múltiplo de 8. Probablemente esto se deba a que el códec está diseñado para uso interno, pero pensé que lo mencionaría aquí porque no encontré ninguna indicación de esta limitación en ninguna otra documentación o discusión de SJCL.

Para ejecutar texto arbitrario a través de toBits, podría rellenar con cero la parte frontal de la representación de la cadena hex para obtener una cadena hexadecimal de longitud% 8 = 0.

    
respondido por el Luckyrat 03.09.2013 - 01:33
fuente

Lea otras preguntas en las etiquetas