¿Calcular la clave de cifrado AES dado el texto simple y su texto cifrado?

29

Tengo la tarea de crear tablas de base de datos en Oracle que contienen cifrado cadenas (es decir, las columnas son RAW). Las cadenas están encriptadas por la aplicación. (usando AES, clave de 128 bits) y almacenado en Oracle, luego recuperado de Oracle y descifrado (es decir, el propio Oracle nunca ve las cadenas no cifradas).

Me he topado con esta columna que será una de las dos cadenas. Me preocupa que alguien se dé cuenta y presumiblemente descubra qué esos dos valores para averiguar la clave AES.

Por ejemplo, si alguien ve que la columna es Ciphertext # 1 o # 2:

  • Ciphertext # 1:

    BF,4F,8B,FE, 60,D8,33,56, 1B,F2,35,72, 49,20,DE,C6.
    
  • Ciphertext # 2:

    BC,E8,54,BD, F4,B3,36,3B, DD,70,76,45, 29,28,50,07.
    

y conoce los Plaintexts correspondientes:

  • Texto sin formato # 1 ("Detroit"):

    44,00,65,00, 74,00,72,00, 6F,00,69,00, 74,00,00,00.
    
  • Texto sin formato # 2 ("Chicago"):

    43,00,68,00, 69,00,63,00, 61,00,67,00, 6F,00,00,00.
    

¿Puede deducir que la clave de cifrado es "Buffalo"?

42,00,75,00, 66,00,66,00, 61,00,6C,00, 6F,00,00,00.

Estoy pensando que solo debería haber una clave de 128 bits que podría convertir Plaintext # 1 a Ciphertext # 1. ¿Significa esto que debo ir a una clave de 192 bits o 256 bits? en su lugar, o encontrar alguna otra solución?

(Como nota aparte, aquí hay otros dos textos cifrados para las mismas palabras de color pero con una clave diferente).

  • Ciphertext # 1 A ("Detroit"):

    E4,28,29,E3, 6E,C2,64,FA, A1,F4,F4,96, FC,18,4A,C5.
    
  • Ciphertext # 2 A ("Chicago"):

     EA,87,30,F0, AC,44,5D,ED, FD,EB,A8,79, 83,59,53,B7.
    

[Pregunta relacionada: Al utilizar AES y CBC, ¿puede el IV ser un hash del texto en claro? ]

    
pregunta Null Pointers etc. 11.03.2011 - 02:17
fuente

5 respuestas

44

Estoy agregando una respuesta como un wiki de la comunidad porque creo que la respuesta aceptada es peligrosamente engañosa . Aquí está mi razonamiento:

La pregunta es sobre la posibilidad de obtener las claves AES. En ese sentido, la respuesta aceptada es correcta: se denomina Ataque de texto llano conocido , y AES se resiste a eso tipo de ataque Por lo tanto, un atacante no podrá aprovechar esto para derivar la clave y eliminarlo con toda la base de datos.

Pero hay otro ataque potencialmente peligroso en juego aquí: un Ciphertext Indistinguishablity Attack . De Wikipedia:

  

Indistinguibilidad del texto cifrado es una propiedad de muchos esquemas de cifrado. Intuitivamente, si un sistema criptográfico posee la propiedad de indistinguibilidad, un adversario no podrá distinguir los pares de textos cifrados en función del mensaje que cifran.

El OP nos mostró que esta columna contiene uno de los dos valores posibles, y dado que el cifrado es determinista (es decir, no usa un IV aleatorio), el atacante puede ver qué filas tienen el mismo valor entre sí. Todo lo que el atacante debe hacer es descifrar el texto sin formato de esa columna para una sola fila, y han descifrado el cifrado de toda la columna. Es una mala noticia si desea que los datos se mantengan privados, lo que supongo que es la razón por la que los cifró en primer lugar.

Mitigación: Para protegerse contra esto, haga que su cifrado no sea determinista (o, al menos, parezca no determinista para el atacante), de modo que los cifrados repetidos del mismo texto simple produzcan diferentes textos cifrados. Por ejemplo, puede hacer esto usando AES en modo Encadenamiento de Bloqueo de Cifrado (CBC) con un azar Vector de inicialización (IV) . Use un generador de números aleatorios seguro para generar un nuevo IV para cada fila y almacene el IV en la tabla. De esta manera, sin la clave, el atacante no puede saber qué filas tienen texto sin formato coincidente.

    
respondido por el Mike Ounsworth 21.03.2016 - 02:08
fuente
15

Para un cifrado de bloque con una tecla n -bit, si, dado un bloque de texto simple y el texto cifrado correspondiente, la clave se puede adivinar en menos de 2 n-1 paso en promedio, entonces se dirá que el cifrado de bloque está "roto" y los criptógrafos harán un punto de no usarlo. El AES no está roto (todavía). Así que no te preocupes.

Sin embargo, todavía se pueden decir algunas cosas:

  • Tener un texto simple y el texto cifrado correspondiente permite a un atacante verificar un posible valor clave.
  • El valor 2n-1 es en realidad la mitad del tamaño del espacio clave. La idea es que el atacante pueda probar todas las claves posibles, hasta que una coincida. En promedio, tendrá que probar la mitad de las teclas antes de golpear la correcta. Esto supone que el espacio clave tiene un tamaño 2n . Aún tiene la posibilidad de reducir el espacio de claves: por ejemplo, si decide que su clave es el nombre de una ciudad de EE. UU., Entonces el número de claves posibles es mucho menor (no debe haber más de 100000 ciudades en los EE. UU.) . Por lo tanto, obtiene la seguridad prometida de 128 bits solo si su proceso de generación de claves puede producir cualquier clave de 128 bits.
  • Aparentemente, usted encripta cada valor rellenándolo directamente en un núcleo AES. Como AES es determinista, esto significa que dos celdas con el mismo valor producirán el mismo bloque cifrado, y cualquier atacante puede notarlo. En otras palabras, filtras información sobre qué celdas son iguales entre sí. Dependiendo de su situación, esto puede o no ser un problema; debe ser consciente de ello.
  • No dice cómo maneja los valores de más de 16 bytes. Este no es un problema simple. En general, esto requiere un modo de encadenamiento como CBC, y un Initialization Vector ( depende del modo; para CBC, un valor aleatorio de 16 bytes - un nuevo IV para cada valor cifrado) (esto también puede corregir la fuga de información del punto anterior).
respondido por el Thomas Pornin 17.07.2011 - 01:28
fuente
5

La respuesta: No, la clave AES no se puede recuperar en este escenario. AES es seguro contra ataques de texto plano conocido. Esto significa que, incluso si un atacante conoce el texto plano y su correspondiente texto cifrado (su cifrado bajo alguna clave AES desconocida), entonces el atacante no puede recuperar la clave AES. En particular, el atacante no puede recuperar la clave AES más rápido que simplemente intentar las posibles claves una tras otra, que es un proceso que llevará más tiempo que la vida de nuestra civilización, suponiendo que la clave AES se elija al azar.

P.S. Noté que lo que esté utilizando para el cifrado no parece usar un IV. Este es un riesgo de seguridad. No sé qué modo de operación está utilizando, pero debería usar un modo de cifrado bien considerado (por ejemplo, cifrado de modo CBC, cifrado de modo CTR) con un IV aleatorio. El hecho de que cifrar el mismo mensaje varias veces siempre le dé el mismo texto cifrado cada vez es una pérdida de seguridad que es mejor evitar. Puede evitar esta fuga utilizando un modo de operación estándar con un IV adecuado. (Probablemente, también debería usar un código de autenticación de mensaje (MAC) para autenticar el texto cifrado y evitar modificaciones.)

    
respondido por el D.W. 18.07.2011 - 04:00
fuente
3

Sal de su cifrado.

De esa manera no habrá ningún patrón en su cifrado. (¡También hay otros beneficios!)

enlace

    
respondido por el Morons 11.03.2011 - 03:55
fuente
2

AES no es tan fácil como construir una mesa de arco iris. Lo primero que debes hacer es que la tabla requiere un vector de inicialización. Siempre y cuando cambies esto de forma semi-regular, construir una mesa de arco iris (lo que no es realmente realista) llevaría mucho tiempo. Órdenes de magnitud larga. Dado que una tabla arco iris típica sería esencialmente 2 dimensiones, esencialmente necesitarías un cubo de conjuntos de resultados para descubrir tanto la clave como la IV.

Si lees el post de Thomas Pornin, él cuenta con bastante gran detalle en cuanto a lo que esto significa, en términos de brutal forzar el resultado.

La preocupación realista es que alguien con acceso a la base de datos podría inyectar una cadena desde otro campo (probablemente porque no está usando un valor de relleno aleatorio en la columna por elemento. O siembra).

Si agrega el valor, no tendrá este problema, y el único ataque (realista) en el propio texto cifrado se hace mucho más difícil.

    
respondido por el Ori 17.07.2011 - 01:50
fuente

Lea otras preguntas en las etiquetas