No, no cifras IVs. No deben reutilizarse nunca, nunca , pero eso es todo para los requisitos IV para el modo CTR: no es absolutamente necesario mantenerlos confidenciales. Además, afirmativamente no deberías cifrar tu IV con la clave utilizada para cifrar tu mensaje, dependiendo de tu esquema de relleno, que puede exponer muy bien uno de los bloques de tu mensaje. Bajo ninguna circunstancia mejorará la seguridad; cualquier vulnerabilidad en el modo CTR será una vulnerabilidad aquí también.
Recuerde cómo funciona el modo CTR. En el modo CTR, los datos reales nunca se pasan como entrada al cifrado de bloque. En su lugar, concatena un contador IV más corto que el bloque y un contador más corto que el bloque, cifra eso y XOR con los datos. Un atacante que recupera el cifrado de IV||n
puede recuperar el bloque n-ésimo.
Ahora, usted no puede cifrar el IV por sí mismo. En realidad, es imposible: la IV es de longitud de subbloque, y AES es incapaz de cifrar nada que no sea un múltiplo exacto de la longitud de un bloque. Necesita rellenar su IV para cifrarla (la razón por la que CTR normalmente no usa el relleno es que no pasa los datos a AES; si lo hiciera, necesitaría un relleno). Supongamos que su esquema de relleno se rellena con ceros y luego marca la longitud del mensaje en el extremo (todos los esquemas de relleno comunes tienen que mostrar la longitud del mensaje en alguna parte , porque si solo se rellena con cero, "john0 "y" john "se convertirían en" john000 ... 000 "). Para su IV de 64 bits, el relleno convertiría IV
en IV||0x00...01000000
; luego lo cifrará y lo añadirá al inicio de su mensaje. Pero el cifrado de eso es exactamente lo que usted XOR con el bloque 64 de su mensaje. Entonces, al cifrar su IV aquí, reveló el bloque número 64 de su mensaje, mientras que con un IV sin cifrar era seguro.
(por cierto: cuando la gente dice "no hagas rodar tu propio criptografía, es fácil cometer errores sutiles", este es uno de esos errores sutiles. Si eres nuevo en la criptografía, puede parecer más seguro cifrar tu IV . Tiene que rellenarlo, así que puede elegir el relleno cero de apariencia bastante razonable con una etiqueta de longitud. Al hacerlo, un atacante puede leer un bloque de su texto cifrado.)
La única forma de evitar esto es rellenar de tal manera que el IV acolchado nunca se cifre para generar material de flujo de clave. Casi la mejor manera de lograr esto es acordar la longitud de IV o enviar texto claro de longitud de IV, encriptar todos los ceros para el primer bloque, y luego no enviar la IV (en el otro extremo, el primer bloque descifrado da IV|0x00...01
, que Puede tomar el primer grupo de bits para obtener el IV). Cualquier cifrado de la IV, si el esquema de relleno es "pegar este material que es k
en hexadecimal, al final de la IV", es equivalente a hacer que el bloque k
conste de todos los ceros. Si lo ve así, puede ver que casi cualquier vulnerabilidad de CTR también afectará su esquema. Las únicas vulnerabilidades relacionadas con el hecho de que el atacante conozca la IV, por otro lado, indicarían un defecto grave en el propio AES, una que significa que cualquier esquema que lo use es instantáneamente sospechoso.
Así que no, es una mala idea cifrar la IV. Si debe hacerlo, la forma de hacerlo es hacer que el primer bloque de su mensaje esté a cero, no envíe el IV y, en el otro extremo, descifre el primero bloquee y tome los primeros 64 bits (o por largos que sean sus IV) como su IV; eso no será menos seguro que el CTR regular. Sin embargo, tampoco será más seguro, porque cualquier defecto en AES-CTR relacionado con la IV hace que todos los modos AES sean presuntamente inseguros.