En criptografía , un código de autenticación de mensajes de encadenamiento de bloques de cifrado ( CBC-MAC ) es una técnica para construir un código de autenticación de mensajes a partir de un cifrado de bloques . El mensaje se cifra con algún algoritmo de cifrado de bloques en modo CBC para crear una cadena de bloques de modo que cada bloque dependa del cifrado adecuado del bloque anterior. Esta interdependencia asegura que un cambio en cualquiera de los bits de texto sin formato hará que el bloque cifrado final cambie de una manera que no se pueda predecir o contrarrestar sin conocer la clave del cifrado del bloque.
Para calcular el CBC-MAC del mensaje m , se cifra m en modo CBC con vector de inicialización cero y se mantiene el último bloque. La siguiente figura esboza el cálculo del CBC-MAC de un mensaje que comprende bloquesusando una clave secreta k y un cifrado de bloque E :
Seguridad con mensajes de longitud fija y variable
Si el cifrado de bloque utilizado es seguro (lo que significa que es una permutación pseudoaleatoria ), entonces CBC-MAC es seguro para mensajes de longitud fija. [1] Sin embargo, por sí solo, no es seguro para mensajes de longitud variable. Por lo tanto, una sola clave solo debe usarse para mensajes de una longitud determinada y conocida. Esto se debe a que un atacante que conoce los pares correctos de etiqueta de mensaje (es decir, CBC-MAC) para dos mensajes y puede generar un tercer mensaje cuyo CBC-MAC también será . Esto se hace simplemente XORing el primer bloque decon ty luego concatenando m con este modificado; es decir, haciendo. Al calcular la MAC para el mensaje, se deduce que calculamos el MAC para m de la manera habitual como t , pero cuando este valor se encadena hacia adelante a la etapa de cálculoRealizaremos una operación OR exclusiva con el valor derivado para la MAC del primer mensaje. La presencia de esa etiqueta en el nuevo mensaje significa que se cancelará, sin dejar contribución al MAC de los bloques de texto sin formato en el primer mensaje m : y por lo tanto la etiqueta para es .
Este problema no se puede resolver agregando un bloque del tamaño de un mensaje al final. [2] Hay tres formas principales de modificar CBC-MAC para que sea seguro para mensajes de longitud variable: 1) Separación de clave de longitud de entrada; 2) Anteposición de longitud; 3) Cifre el último bloque. [2] En tal caso, también se puede recomendar utilizar un modo de funcionamiento diferente, por ejemplo, CMAC o HMAC para proteger la integridad de los mensajes de longitud variable.
Longitud anteponiendo
Una solución es incluir la longitud del mensaje en el primer bloque; [3] de hecho, se ha demostrado que CBC-MAC es seguro siempre que no se utilicen dos mensajes que sean prefijos entre sí, y anteponer la longitud es un caso especial de esto. [4] Esto puede ser problemático si no se conoce la longitud del mensaje cuando comienza el procesamiento.
Cifrar el último bloque
Cifrar el último bloque CBC-MAC (ECBC-MAC) [5] se define como CBC-MAC-ELB ( m , ( k 1 , k 2 )) = E ( k 2 , CBC-MAC ( k 1 , m ) ) . [2] En comparación con los otros métodos discutidos para extender CBC-MAC a mensajes de longitud variable, encriptar el último bloque tiene la ventaja de no necesitar saber la longitud del mensaje hasta el final del cálculo.
Métodos de ataque
Como ocurre con muchos esquemas criptográficos, el uso ingenuo de cifrados y otros protocolos puede conducir a posibles ataques, reduciendo la efectividad de la protección criptográfica (o incluso volviéndola inútil). Presentamos los ataques que son posibles debido a un uso incorrecto del CBC-MAC. [6]
Usar la misma clave para el cifrado y la autenticación
Un error común es reutilizar la misma clave k para el cifrado CBC y CBC-MAC. Si bien la reutilización de una clave para diferentes propósitos es una mala práctica en general, en este caso particular el error conduce a un ataque espectacular:
Supongamos que Alice le ha enviado a Bob los bloques de texto cifrado . Durante el proceso de transmisión, Eve puede manipular cualquiera de los bloques de texto cifrado y ajuste cualquiera de los bits allí como elija, siempre que el bloque final, , sigue siendo el mismo. Suponemos, a los efectos de este ejemplo y sin pérdida de generalidad, que el vector de inicialización utilizado para el proceso de cifrado es un vector de ceros.
Cuando Bob recibe el mensaje, primero descifrará el mensaje invirtiendo el proceso de cifrado que aplicó Alice, utilizando los bloques de texto cifrado. . El mensaje manipulado, entregado a Bob en reemplazo del original de Alice, es.
Bob primero descifra el mensaje recibido utilizando la clave secreta compartida K para obtener el texto sin formato correspondiente. Tenga en cuenta que todo el texto sin formato producido será diferente del que envió Alice originalmente, porque Eve ha modificado todo menos el último bloque de texto cifrado. En particular, el texto sin formato final,, difiere del original, , que Alice envió; aunque es el mismo, , entonces un texto sin formato diferente se produce al encadenar el bloque de texto cifrado anterior en el OR exclusivo después del descifrado de : .
De ello se deduce que Bob ahora calculará la etiqueta de autenticación utilizando CBC-MAC sobre todos los valores de texto sin formato que decodificó. La etiqueta del mensaje nuevo, es dado por:
Observe que esta expresión es igual a
que es exactamente :
y se sigue que .
Por lo tanto, Eve pudo modificar el texto cifrado en tránsito (sin saber necesariamente a qué texto sin formato corresponde) de modo que un mensaje completamente diferente, , se produjo, pero la etiqueta de este mensaje coincidía con la etiqueta del original, y Bob no sabía que el contenido se había modificado en tránsito. Por definición, un código de autenticación de mensaje se rompe si podemos encontrar un mensaje diferente (una secuencia de pares de texto sin formato) que produce la misma etiqueta que el mensaje anterior, P , con. De ello se deduce que el protocolo de autenticación de mensajes, en este escenario de uso, se ha roto y Bob ha sido engañado haciéndole creer que Alice le envió un mensaje que ella no produjo.
Si, en cambio, usamos diferentes claves para las etapas de encriptación y autenticación, digamos y , respectivamente, este ataque se frustra. El descifrado de los bloques de texto cifrado modificados. obtiene una cadena de texto sin formato . Sin embargo, debido al uso de MAC de una clave diferente, no podemos "deshacer" el proceso de descifrado en el paso de avance del cálculo del código de autenticación del mensaje para producir la misma etiqueta; cada uno modificado ahora será encriptado por en el proceso CBC-MAC a algún valor .
Este ejemplo también muestra que un CBC-MAC no se puede utilizar como una función unidireccional resistente a colisiones: dada una clave, es trivial crear un mensaje diferente que "aplica un hash" a la misma etiqueta.
Permitir que el vector de inicialización varíe en valor
Al cifrar datos utilizando un cifrado de bloques en el modo de encadenamiento de bloques de cifrado (u otro), es común introducir un vector de inicialización en la primera etapa del proceso de cifrado. Por lo general, se requiere que este vector se elija al azar (un nonce ) y que no se repita para ninguna clave secreta dada bajo la cual opera el cifrado de bloque. Esto proporciona seguridad semántica, al garantizar que el mismo texto sin formato no esté cifrado con el mismo texto cifrado, lo que permite a un atacante inferir que existe una relación.
Cuando se calcula un código de autenticación de mensaje, como CBC-MAC, el uso de un vector de inicialización es un posible vector de ataque.
En la operación de un cifrado de encadenamiento de bloques de texto cifrado, el primer bloque de texto plano se mezcla con el vector de inicialización utilizando un OR exclusivo (). El resultado de esta operación es la entrada al cifrado de bloque para el cifrado.
Sin embargo, al realizar el cifrado y el descifrado, debemos enviar el vector de inicialización en texto sin formato, por lo general como el bloque inmediatamente anterior al primer bloque de texto cifrado, de modo que el primer bloque de texto sin formato se pueda descifrar y recuperar con éxito. Si calculamos un MAC, también necesitaremos transmitir el vector de inicialización a la otra parte en texto sin formato para que puedan verificar que la etiqueta del mensaje coincida con el valor que han calculado.
Si permitimos que el vector de inicialización se seleccione arbitrariamente, se deduce que el primer bloque de texto sin formato puede potencialmente modificarse (transmitiendo un mensaje diferente) mientras se produce la misma etiqueta de mensaje.
Considere un mensaje . En particular, al calcular la etiqueta de mensaje para CBC-MAC, supongamos que elegimos un vector de inicialización tal que el cálculo del MAC comience con . Esto produce un par (mensaje, etiqueta).
Ahora produce el mensaje . Para cada bit modificado en, invierta el bit correspondiente en el vector de inicialización para producir el vector de inicialización . De ello se deduce que para calcular el MAC para este mensaje, comenzamos el cálculo por. Como los bits tanto en el texto plano como en el vector de inicialización se han invertido en los mismos lugares, la modificación se cancela en esta primera etapa, lo que significa que la entrada al cifrado de bloque es idéntica a la de. Si no se realizan más cambios en el texto sin formato, se derivará la misma etiqueta a pesar de que se transmita un mensaje diferente.
Si se elimina la libertad de seleccionar un vector de inicialización y todas las implementaciones de CBC-MAC se fijan en un vector de inicialización particular (a menudo el vector de ceros, pero en teoría, podría ser cualquier cosa siempre que todas las implementaciones estén de acuerdo), este ataque no puede continuar.
En resumen, si el atacante puede configurar el IV que se utilizará para la verificación de MAC, puede realizar una modificación arbitraria del primer bloque de datos sin invalidar la MAC.
Usando un vector de inicialización predecible
A veces, IV se utiliza como contador para evitar ataques de repetición de mensajes. Sin embargo, si el atacante puede predecir qué IV se utilizará para la verificación de MAC, puede reproducir el mensaje observado anteriormente modificando el primer bloque de datos para compensar el cambio en el IV que se utilizará para la verificación. Por ejemplo, si el atacante ha observado el mensaje con y sabe él puede producir que pasará la verificación MAC con .
La contramedida más simple es cifrar el IV antes de usarlo (es decir, anteponer IV a los datos). Alternativamente, se puede usar MAC en modo CFB, porque en el modo CFB el IV está encriptado antes de ser XORed con los datos.
Otra solución (en caso de que no se requiera protección contra ataques de reproducción de mensajes) es usar siempre un vector cero IV. [7] Tenga en cuenta que la fórmula anterior para se convierte en . Así que desde y son el mismo mensaje, por definición tendrán la misma etiqueta. Esto no es una falsificación, sino el uso previsto de CBC-MAC.
Estándares que definen el algoritmo
La autenticación de datos informáticos FIPS PUB 113 es un estándar del gobierno de EE . UU. (Ahora obsoleto) que especificaba el algoritmo CBC-MAC utilizando DES como cifrado de bloque.
El algoritmo CBC-MAC es equivalente al algoritmo 1 MAC ISO / IEC 9797-1 .
Ver también
- CMAC : un algoritmo MAC basado en cifrado de bloques que es seguro para mensajes de diferentes longitudes (recomendado por NIST ).
- OMAC y PMAC : otros métodos para convertir cifrados en bloque en códigos de autenticación de mensajes (MAC).
- Función de compresión unidireccional: las funciones hash se pueden realizar a partir de cifrados en bloque. Pero tenga en cuenta que existen diferencias significativas en la función y los usos de seguridad entre MAC (como CBC-MAC) y hashes .
Referencias
- ^ M. Bellare, J. Kilian y P. Rogaway. La seguridad del código de autenticación de mensajes de encadenamiento de bloques de cifrado. JCSS 61 (3): 362–399, 2000.
- ^ a b c Véase la sección 5 de Bellare, et al.
- ^ ISO / IEC 9797-1: 1999 Tecnología de la información - Técnicas de seguridad - Códigos de autenticación de mensajes (MAC) - Parte 1: Mecanismos que utilizan un cifrado de bloque , cláusula 6.1.3 Método de relleno 3
- ^ C. Rackoff y S. Gorbunov. Sobre la seguridad del código de autenticación de mensajes de cadena de bloques.
- ^ http://spark-university.s3.amazonaws.com/stanford-crypto/slides/05.3-integrity-cbc-mac-and-nmac.pptx
- ^ Por qué odio CBC-MAC por Matthew D. Green
- ^ Introducción a la criptografía moderna, segunda edición por Jonathan Katz y Yehuda Lindell