Uso de AES en CTR para conexiones de red basadas en TCP / IP: ¿necesita cifrar los IV?

0

Para el cifrado basado en AES en las conexiones TCP / IP, supongo que debo hacer lo siguiente:

  1. Haga que las 2 partes compartan una clave común, asumiendo que estoy haciendo AES-128 y luego una secuencia de 16 bytes. Lo ideal es que los bits sean aleatoriamente seguros.

  2. Ya que estamos ejecutando AES en modo CTR y la clave secreta es fija, debemos elegir un IV aleatorio y seguro para cada instancia de flujo. Dado que una conexión TCP / IP es en realidad dúplex completo, asumo que necesito 2 IV por conexión, una para cada dirección. También necesito transmitir cada IV al otro extremo para que el flujo correspondiente sea descifrado.

Editar nota: el esquema descrito anteriormente es propenso a los ataques de repetición. Tal vez un mejor esquema sea enviar los IV descifrados a la otra parte y obligar a la otra parte a cifrar una constante, y si podemos descifrar para obtener la constante posterior, se autentica el otro extremo. Además, el esquema no garantiza la integridad del mensaje.

Mi pregunta es, para los IV, ¿debo cifrar los IV con mi clave secreta antes de enviarlos? Me dijeron que las intravenosas no tienen que mantenerse en secreto. ¿Hay algún beneficio de seguridad si los cifro antes de enviarlos?

ps. puede que se pregunte por qué no estoy usando SSL / TLS. Nuestra aplicación es compatible con SSL / TLS, pero también queremos admitir el modo de cifrado simétrico alternativo donde la sobrecarga de la conexión se puede minimizar, ya que los clientes se desconectan y se vuelven a conectar constantemente.

    
pregunta javaPhobic 27.01.2015 - 06:36
fuente

1 respuesta

3

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.

    
respondido por el cpast 27.01.2015 - 08:42
fuente

Lea otras preguntas en las etiquetas