Identificar el modo AES
Digamos que tengo una API que acepta Plaintext y IV como parámetro de entrada y devuelve el texto cifrado. Sé que la API está usando el cifrado AES 128, pero ahora necesito identificar qué modo de cifrado (ECB, CBC, OFB, CFB o CTR) está usando. ¿Cómo puedo identificar el modo de cifrado? Cualquier sugerencia, sugerencia u orientación será muy apreciada.
Ejemplo:
curl "http://dev/api/v1.0/test?iv=00112233445566778899&text=01234567"
Respuesta: 7fcb5212d14de7ddcc334ec31acec6ae
Respuestas
Tiene una caja negra que cifra los datos y está trabajando bajo el supuesto de que esta caja negra implementa un modo popular (ECB, CBC, CTR, OFB o CFB) de cifrado (no autenticado) sobre un cifrado de bloque. Puede enviar textos sin formato de entrada para cifrar, así como un IV de su elección.
Primero, puede distinguir fácilmente entre modos de transmisión y modos sin transmisión:
- CTR, OFB y CFB son modos de cifrado de flujo. El texto cifrado siempre tiene la misma longitud que el texto sin formato.
- ECB y CBC solo pueden cifrar bloques completos. La longitud del texto cifrado es siempre un múltiplo de la longitud del bloque (16 bytes para AES, Camellia, ARIA, SM4).
- Hay modos que no son de flujo continuo para los que el texto cifrado tiene la misma longitud que el texto sin formato, por ejemplo, CTS en la parte superior de un modo como CBC o XEX. Pero no los consideraré en este análisis.
Entonces encripte 1 byte. Si obtiene 1 byte de texto cifrado, es un modo de transmisión. Si obtiene 16 bytes, es un modo de bloque completo con relleno. Si recibe un error pero el cifrado de 16 bytes funciona, es un modo de bloque completo sin relleno.
Modos de relleno y bloque
En realidad, el BCE no usa una vía intravenosa. Entonces, si obtiene el mismo resultado independientemente del IV, es ECB; de lo contrario, probablemente no lo sea. Pero si se trata de un sistema de diseño extraño, el IV podría usarse de una manera no estándar, por ejemplo, un "cuasi-ECB" podría usar ECB en IV + texto sin formato.
Cifre dos bloques idénticos. Si los dos primeros bloques de texto cifrado son idénticos, es ECB. De lo contrario, por eliminación, es CBC. (Puede que haya o no un tercer bloque según el método de relleno).
El relleno CBC (o ECB) normalmente aumenta el tamaño del texto cifrado de 1 a 16 bytes. La razón por la que el relleno es siempre de al menos 1 byte es para que el descifrado sea inequívoco: si hubiera casos de relleno vacío, sería imposible saberlo mirando el texto cifrado descifrado pero aún no sin relleno. La mayoría de los métodos de relleno transmiten la longitud del relleno a través del valor del último byte del texto cifrado descifrado pero aún no sin relleno. Sin embargo, es posible permitir un relleno vacío si la longitud del texto sin formato se transmite por separado o si el texto sin formato tiene propiedades conocidas, como terminar con un determinado byte. (No es una buena idea, pero estamos hablando de analizar un sistema mal diseñado aquí).
Distintos modos de transmisión
(Notaciones: $E$ es la función de cifrado de bloque, $||$ es la concatenación de cadenas, $\oplus$ es xor bit a bit, $+$ es la suma de los valores del contador, $\mathbf{0}$ es un bloque cero de todos los bits, $\mathbf{1}$ es un bloque donde todos los bits son cero excepto que el último bit es 1.)
Debido a que puede enviar el mismo IV para el cifrado varias veces, es posible distinguir entre los modos de transmisión. Veamos cómo un texto plano de dos bloques$P_1 || P_2$ está encriptado en un texto cifrado de dos bloques $C_1 || C_2$:
- DE B: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV})) \oplus P_2$
- CFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV}) \oplus P_1) \oplus P_2$
- CTR: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(\mathrm{IV}+1) \oplus P_2$
Usemos esto para construir una forma de distinguir estos tres modos.
- Cifre un texto sin formato de un bloque con todos los bits cero con un IV de todos los bits cero. No importa cuál de estos tres modos implemente la caja negra, la salida es$E(\mathbf{0})$.
- Cifre un texto sin formato de un bloque con todos los bits y cero con el IV $E(\mathbf{0})$. La salida es$E(E(\mathbf{0}))$.
- Cifre un texto sin formato de un bloque con todos los bits y cero con el IV $\mathbf{1}$(todos-bits-cero excepto que el último bit es 1). La salida es$E(\mathbf{1})$.
- Cifre un texto sin formato de un bloque con todos los bits y cero con el IV $E(\mathbf{0}) \oplus \mathbf{1}$. La salida es$E(E(\mathbf{0}) \oplus \mathbf{1})$.
- Ahora cifre un texto sin formato de dos bloques: $\mathrm{IV} = \mathbf{0}$, $P_1 = \mathbf{1}$, $P_2 = \mathbf{0}$. Mira el segundo bloque del texto cifrado.
- DE B: $C_2 = E(E(\mathbf{0}))$ (calculado en el paso 2).
- CFB: $C_2 = E(E(\mathbf{0}) \oplus \mathbf{1})$ (calculado en el paso 4).
- CTR: $E(\mathrm{0} + 1)$. Esto suele ser$E(\mathrm{1})$ (calculado en el paso 3) pero puede ser diferente si la implementación de CTR realiza el incremento del contador de manera diferente.
¿Cómo puedo identificar el modo de cifrado?
No puede identificar completamente este modo sin enviar $2^{64}$ish bytes de datos bajo la misma clave, ya que solo entonces los modos de transmisión (CFB, OFB, CTR) comienzan a fallar en seguridad de diferentes maneras.
Sin embargo, puede estar seguro de que si ve un texto cifrado que no es un múltiplo de la longitud del bloque (16 bytes para AES), entonces tiene uno de CFB, OFB o CTR (o un modo de transmisión similar o uno construido sobre cualquier de ellos).
Ahora, si siempre obtiene salidas que son múltiplos de la longitud del bloque, es probable que sea el modo CBC o ECB. Puede distinguir estos dos en función de la vulnerabilidad ECB clásica que CBC no tiene: bloques iguales de entradas se procesan en bloques iguales de salidas. En la práctica, esto significa que simplemente podría enviar 32 bytes todos 0 y si obtiene algo que muestre dos secuencias de 16 bytes que son iguales, tiene ECB, de lo contrario, CBC. Alternativamente, si especifica diferentes IV para el mismo texto sin formato y aún obtiene el mismo texto cifrado, también sabe que se usa ECB (aunque los IV de CBC realmente deben elegirse al azar y no por el adversario ...).