Sobre la clave del algoritmo AES y el texto cifrado

1

Tengo las dos preguntas siguientes sobre el algoritmo AES:

A- ¿La clave debe seguir algún patrón específico aparte de la longitud o puede ser una cadena completamente aleatoria? Entonces, si selecciono 16 caracteres ASCII aleatorios, ¿podría usarlos directamente como una clave de 128 bits? Si la respuesta es NO, ¿hay algoritmos de cifrado en los que se pueda hacer esto? Si la respuesta es SÍ, ¿recibiré algún resultado válido en la pregunta B?

B- Si utilizo una clave aleatoria para descifrar un texto cifrado específico, ¿recibiría algún resultado válido (obviamente diferente del texto simple original)?

    
pregunta Lucas 24.01.2016 - 01:58
fuente

4 respuestas

2

A) Las claves AES se componen de bits binarios, no de cadenas de caracteres. De hecho, deben ser aleatorios, y no se requieren otras propiedades. Sin embargo, esto implica que deben ser bits aleatorios y no caracteres ASCII.

B) Si descifra el texto cifrado con una clave aleatoria arbitraria, obtendrá algunos bytes como texto simple. Si estos bytes constituyen un texto sin formato válido depende de su definición específica de válido, pero para la mayoría de las definiciones de válido, la respuesta es no. Sin embargo, si realmente está preguntando si causará que el descifrado falle, entonces esa respuesta también es no.

    
respondido por el Xander 24.01.2016 - 04:00
fuente
1

A: Cualquier clave de cifrado para cualquier algoritmo simétrico puede y debe ser una cadena aleatoria de bits. La aplicación de cualquier tipo de patrón reduciría la espacio de teclas y así reducir la seguridad.

Una cadena de 16 caracteres ASCII aleatorios funcionaría como una clave, pero No sería una muy buena. Una cadena de bits aleatoria de esa longitud tiene 128 bits de entropy . Hay 95 caracteres ASCII imprimibles, dando 6.57 bits de entropía por carácter y un total de 105.12 bits de entropía para la cuerda. Esto es bastante seguro, pero no tan bueno como podría ser.

Lo que generalmente se hace en la práctica es usar un memorable, largo frase de contraseña y ejecutarlo a través de una función S2K (string-to-key), una que está diseñado para ser inherentemente lento. La frase de contraseña es hash, entonces El resultado es nuevamente hash, y esto se repite miles o millones. de veces Salt también se usa comúnmente para hacer la misma frase de contraseña resultado en diferentes claves. Ambas medidas dificultan la vida de un atacante que intenta encontrar la frase de contraseña por búsqueda de fuerza bruta; la hash lento ralentiza las pruebas, y la sal impide el uso de tablas de arco iris .

La Sección 3.7 de RFC 4880 presenta tres esquemas S2K utilizados en el Protocolo OpenPGP. El bueno usa sal y una iteración especificada por el usuario. Recuento que puede ir desde 1.024 hasta más de 65 millones.

B: Bueno, sí, si "válido" quiere decir "la función tiene una salida". Obtendría una cadena de bits de apariencia aleatoria de la misma longitud que la Mensaje original. Tenga en cuenta que OpenPGP, por ejemplo, utiliza un valor de 16 bits para detecta una clave incorrecta inmediatamente, antes de perder mucho tiempo usando Para "descifrar" incorrectamente un mensaje largo. Pero si no chequeas, entonces sí, escupirá algo.

    
respondido por el Tom Zych 24.01.2016 - 12:05
fuente
1

Una clave de 128 bits para AES solo debe tener una longitud de 128 bits. Ninguna otra propiedad es requerida , aunque otras propiedades pueden ser deseadas .

Si elige una cadena de 16 caracteres, entonces realmente no está utilizando esos 128 bits al máximo. ASCII solo admite 7 bits por carácter (el primer bit de cada byte es siempre cero), y su entropía real alcanza un máximo de aproximadamente 6 bits por carácter de texto ASCII. Por lo tanto, una contraseña de 16 caracteres si se usa directamente para AES de 128 bits tiene el mismo nivel de seguridad que una clave de 96 bits, en lugar de una clave de 128 bits.

Para una clave de cifrado, desea utilizar esos bits preciosos al máximo; quieres que cada bit sea igualmente impensable.

La mejor manera de hacerlo es usar un hash. Lo bueno de usar un hash es que su contraseña no tiene que ser exactamente con 16 caracteres; puede ser más corto o más largo, y aún así obtendrá una distribución aleatoria y consistente de bits en su clave resultante.

MD5 producirá una salida de 128 bits, por lo que es conveniente. Pero en realidad, MD5 está bastante dañado y su salida de hash no necesita ser exactamente del mismo tamaño que su clave, solo tiene que ser al menos tan grande como su llave. Podrías usar SHA-256 y luego tomar los primeros 128 bits de hash de salida para tu clave. O los últimos 128 bits. O los 128 bits medios. Mientras seas consistente, no importa.

Lo que, mientras no importa, ¿qué tal si ejecutamos el hash varias veces? De esa manera, un atacante tendrá que ejecutar el hash varias veces para cada suposición si quiere adivinar nuestra contraseña.

En realidad, alguien ya lo ha pensado, y hay una lista de "Funciones de derivación de claves" específicamente diseñadas para tomar una entrada arbitraria de cualquier tipo y tamaño y producir una clave de al menos X bits, a menudo con la propiedad agregada de que derivar la clave de la contraseña lleva mucho tiempo (y quizás MUCHA memoria).

Se han discutido de forma bastante exhaustiva aquí, así que busque PBKDF2 o scrypt para obtener más detalles.

Entonces, para resumir, la respuesta es sí, funciona , pero no, no deberías hacerlo porque hay mejores opciones listas para usar que hacen que tu teclas mejor en todos los sentidos .

    
respondido por el tylerl 24.01.2016 - 06:08
fuente
0

Por lo que sé, no es la cadena que funciona como un patrón o una clave, sino una matriz de bytes, por ejemplo. La longitud de la clave es muy importante. No utiliza una clave de cadena aleatoria como palabra clave, pero puede generar una matriz de bytes de 128 bits a partir de una palabra clave de cadena. Los algoritmos hash hacen eso por ti. Como ejemplo, puede usar el algoritmo de hash SHA para marcar una palabra clave, luego usar 128 bits como clave.

Vea mis códigos como ejemplo aquí . Su tema no está relacionado, pero creo que tiene todo lo que necesitas, y está codificado con Java.

Sobre su segunda pregunta, me temo que no obtendrá un resultado válido. Si descifra con éxito los datos con una clave incorrecta, solo obtendrá bytes sin sentido incorrectos como texto simple.

    
respondido por el Sepehr GH 24.01.2016 - 10:54
fuente

Lea otras preguntas en las etiquetas