¿Cómo puedo mitigar los ataques de texto sin formato elegidos para AES ECB?

3

Estoy desarrollando en una plataforma donde mi única opción de cifrado usa AES ECB. El cifrado se utiliza para proteger los parámetros que el usuario puede establecer y, por lo tanto, es susceptible a un ataque de texto simple elegido. No es una galleta, sino similar; el usuario ingresa las credenciales, que con otros datos se envían al servidor para su autenticación y autorización.

¿Qué pasos puedo seguir para que el ataque de texto simple elegido no sea práctico?

Específicamente, mi mitigación propuesta actual es agregar "relleno" al azar antes y después de mi contenido significativo. El blob encriptado tendrá aproximadamente la misma longitud, pero el lugar donde aparece el texto cifrado del texto sin formato elegido será diferente para cada llamada. En este punto, las comunicaciones son de bajo volumen, por lo que estoy menos preocupado por la eficiencia, el tamaño o el tiempo de procesamiento de los datos. ¿Es esta una mitigación efectiva?

Alternativamente, podría considerar la asignación aleatoria del orden de los campos (el texto simple es JSON). Eso es un poco más difícil de implementar. ¿Esto haría el ataque poco práctico?

He leído y creo que entiendo esta gran pregunta y respuesta .

    
pregunta Tony 18.01.2016 - 00:43
fuente

1 respuesta

2

La forma más sencilla de lidiar con esto es pensar en implementar más o menos modo CBC usted mismo. Todo lo que necesita es que usted esté seguro del tamaño de bloque utilizado:

  • Cree un IV aleatorio (y único) del mismo tamaño que el Tamaño del bloque AES (128 bits) .
  • Cifre ese bloque y almacene el resultado (llamémoslo A)
  • Cree una cadena de bloques de 128 bits que contengan su mensaje real (agregue relleno según sea necesario).
  • Para cada bloque en esa cadena, XOR con el contenido del búfer A y encriptarlo individualmente. Almacene el resultado en su búfer de salida y reemplace el contenido del búfer A con él también.

Para descifrar los datos, descifra el primer bloque de 128 bits y almacena el resultado en un búfer de 128 bits. Luego, toma cada bloque de 128 bits a continuación, descifra, XOR el resultado con el contenido del búfer A, almacena el resultado tanto en el búfer de salida como en A y avanza al siguiente bloque.

Luego remueves la almohadilla y listo.

Editar: Una palabra de advertencia:

La mejor manera sería usar una biblioteca estándar en lugar de jugar con un código como este.

Al hacer lo que te sugerí, corres un gran riesgo de agregar alguna vulnerabilidad a tu implementación: aunque entiendo completamente tu necesidad de trabajar con limitaciones específicas, debes ser consciente del hecho de que es muy probable para terminar con un código que es vulnerable a algún tipo de ataque (aunque podría ser más resistente que la implementación inicial).

Además, si confía en el código que utiliza el modo ECB, significa que el autor de ese código no entendió la criptografía moderna y, por lo tanto, probablemente contenga otros errores básicos.

    
respondido por el Stephane 18.01.2016 - 08:34
fuente

Lea otras preguntas en las etiquetas