stringtranslate.com

CBC-MAC

En criptografía , un código de autenticación de mensajes en cadena de bloques cifrados ( CBC-MAC ) es una técnica para construir un código de autenticación de mensajes (MAC) a partir de un cifrado de bloques . El mensaje se cifra con algún algoritmo de cifrado de bloques en modo de encadenamiento de bloques cifrados (CBC) para crear una cadena de bloques de modo que cada bloque dependa del cifrado adecuado del bloque anterior. Esta interdependencia garantiza que un cambio en cualquiera de los bits de texto simple hará que el bloque cifrado final cambie de una manera que no se puede predecir ni contrarrestar sin conocer la clave del cifrado de bloques.

Construcción CBC-MAC

Para calcular el CBC-MAC del mensaje m , se cifra m en modo CBC con un vector de inicialización cero y se conserva el último bloque. La siguiente figura esboza el cálculo del CBC-MAC de un mensaje que comprende bloques utilizando una clave secreta k y un cifrado de bloque E : CBC-MAC por sí solo no es seguro para mensajes de longitud variable [1] (ver la discusión a continuación) y actualmente se utiliza para construir una familia de funciones pseudoaleatorias [2] y como un componente del modo CCM .

Uso en normas

La construcción CBC-MAC se utiliza como parte del modo CCM utilizado en IEEE 802.11i y NIST SP 800-97 (como CCMP , el protocolo de cifrado CCM para WPA2 ), IPsec , [3] y TLS 1.2, [4] así como Bluetooth Low Energy (a partir de Bluetooth 4.0 , consulte NIST SP 800-121 Rev2). [5] Está disponible para TLS 1.3, pero no está habilitado de forma predeterminada en OpenSSL . [6]

CBC-MAC también se utiliza como un "componente de acondicionamiento" (también conocido como extractor de aleatoriedad, [2] un método para generar cadenas de bits con entropía completa ) en NIST SP 800-90B .

Estándares que definen el algoritmo

FIPS PUB 113 Computer Data Authentication 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 también está incluido en ANSI X9.9, ANSI X9.19, ISO 8731-1 e ISO/IEC 9797-1 MAC (algoritmo 1). [7]

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í mismo, no es seguro para mensajes de longitud variable. Por lo tanto, cualquier clave única solo debe usarse para mensajes de una longitud fija y conocida. Esto se debe a que un atacante que conoce la etiqueta de autenticación correcta (es decir, CBC-MAC) se empareja para dos mensajes y puede generar un tercer mensaje cuyo CBC-MAC también será . Esto se hace simplemente mediante XORing del primer bloque de con t y luego concatenando m con este modificado ; es decir, haciendo . Al calcular el 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álculo, realizaremos una operación OR exclusiva con el valor derivado para el MAC del primer mensaje. La presencia de esa etiqueta en el nuevo mensaje significa que se cancelará, sin dejar ninguna contribución a la 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 añadiendo un bloque del tamaño del mensaje al final. [8] Hay tres formas principales de modificar CBC-MAC para que sea seguro para mensajes de longitud variable: 1) Separación de claves de longitud de entrada; 2) Anteposición de longitud; 3) Cifrar el último bloque. [8] En tal caso, también se puede recomendar utilizar un modo de operación diferente, por ejemplo, CMAC o HMAC para proteger la integridad de los mensajes de longitud variable.

Anteponer longitud

Una solución es incluir la longitud del mensaje en el primer bloque; [9] 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. [10] Esto puede ser problemático si no se conoce la longitud del mensaje cuando comienza el procesamiento.

Cifrar el último bloque

Cálculo del cifrado CBC-MAC del último bloque.

El cifrado del último bloque CBC-MAC (ECBC-MAC) [11] se define como CBC-MAC-ELB( m , ( k 1 , k 2 )) = E ( k 2 , CBC-MAC( k 1 , m )) . [8] En comparación con los otros métodos analizados para extender CBC-MAC a mensajes de longitud variable, el cifrado del último bloque tiene la ventaja de no necesitar saber la longitud del mensaje hasta el final del cálculo.

Métodos de ataque contra el uso incorrecto

Como sucede con muchos esquemas criptográficos, el uso ingenuo de cifrados y otros protocolos puede dar lugar a posibles ataques, lo que reduce la eficacia de la protección criptográfica (o incluso la vuelve inútil). Presentamos ataques que son posibles debido al uso incorrecto de CBC-MAC. [12]

Usando la misma clave para encriptación y autenticación

Un error común es reutilizar la misma clave k para el cifrado CBC y CBC-MAC. Aunque 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 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 ajustar cualquiera de los bits que contengan como desee, siempre que el bloque final, , siga siendo el mismo. Suponemos, para los fines 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 lo descifrará invirtiendo el proceso de cifrado que aplicó Alice, utilizando los bloques de texto cifrado . El mensaje alterado, entregado a Bob en reemplazo del original de Alice, es .

Bob primero descifra el mensaje recibido usando la clave secreta compartida K para obtener el texto plano correspondiente. Nótese que todo el texto plano producido será diferente del que Alice envió originalmente, porque Eve ha modificado todos los bloques de texto cifrado excepto el último. En particular, el texto plano final, , difiere del original, , que Alice envió; aunque es el mismo, , por lo que se produce un texto plano diferente al encadenar el bloque de texto cifrado anterior en el OR exclusivo después del descifrado de : .

De ello se deduce que Bob calculará ahora la etiqueta de autenticación utilizando CBC-MAC sobre todos los valores de texto sin formato que decodificó. La etiqueta para el nuevo mensaje, , viene dada por:

Nótese 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 simple corresponde) de modo que se produjo un mensaje completamente diferente, , pero la etiqueta de este mensaje coincidía con la etiqueta del original, y Bob no sabía que el contenido había sido modificado en tránsito. Por definición, un código de autenticación de mensajes está roto si podemos encontrar un mensaje diferente (una secuencia de pares de texto simple ) que produzca 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 para creer que Alice le envió un mensaje que no produjo.

Si, en cambio, utilizamos claves diferentes para las etapas de cifrado y autenticación, digamos y , respectivamente, este ataque se frustra. El descifrado de los bloques de texto cifrado modificados obtiene una cadena de texto simple . Sin embargo, debido al uso de una clave diferente por parte de la MAC , no podemos "deshacer" el proceso de descifrado en el paso hacia adelante del cálculo del código de autenticación del mensaje para producir la misma etiqueta; cada modificado ahora será cifrado por en el proceso CBC-MAC a un valor .

Este ejemplo también muestra que una CBC-MAC no puede usarse como una función unidireccional resistente a colisiones: dada una clave, es trivial crear un mensaje diferente que "hash" a la misma etiqueta.

Permitir que el vector de inicialización varíe su valor

Al cifrar datos mediante un cifrado de bloques en modo de encadenamiento de bloques de cifrado (u otro), es habitual introducir un vector de inicialización en la primera etapa del proceso de cifrado. Normalmente, se requiere que este vector se elija de forma aleatoria (un nonce ) y que no se repita para ninguna clave secreta dada bajo la que opera el cifrado de bloques. Esto proporciona seguridad semántica, al garantizar que el mismo texto sin formato no se cifre con el mismo texto cifrado, lo que permite a un atacante inferir que existe una relación.

Al calcular un código de autenticación de mensajes, como por ejemplo CBC-MAC, el uso de un vector de inicialización es un posible vector de ataque.

En el funcionamiento de un cifrador de bloques de texto cifrado, el primer bloque de texto sin formato se mezcla con el vector de inicialización mediante un OR exclusivo ( ). El resultado de esta operación es la entrada al cifrador de bloques para su cifrado.

Sin embargo, al realizar el cifrado y descifrado, se nos exige enviar el vector de inicialización en texto sin formato (normalmente, 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 correctamente. Si se calcula una MAC, también necesitaremos transmitir el vector de inicialización a la otra parte en texto sin formato para que pueda verificar que la etiqueta del mensaje coincida con el valor que ha calculado.

Si permitimos que el vector de inicialización se seleccione arbitrariamente, se deduce que el primer bloque de texto simple puede modificarse potencialmente (transmitiendo un mensaje diferente) mientras se produce la misma etiqueta de mensaje.

Consideremos un mensaje . En particular, al calcular la etiqueta del mensaje para CBC-MAC, supongamos que elegimos un vector de inicialización tal que el cálculo de la MAC comience con . Esto produce un par (mensaje, etiqueta) .

Ahora, genere 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 la MAC de este mensaje, comenzamos el cálculo con . Como los bits tanto del texto simple como del 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 bloques es idéntica a la de . Si no se realizan más cambios en el texto simple, 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 establecer 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.

Uso de un vector de inicialización predecible

En ocasiones, el 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 MAC, puede reproducir el mensaje observado previamente 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 , puede producir que pasará la verificación MAC con .

La contramedida más sencilla es cifrar el IV antes de usarlo (es decir, anteponer el IV a los datos). Otra opción es utilizar MAC en modo CFB, ya que en este modo el IV se cifra antes de aplicarle la operación XOR con los datos.

Otra solución (en caso de que no se requiera protección contra ataques de repetición de mensajes) es utilizar siempre un IV de vector cero. [13] Nótese que la fórmula anterior para se convierte en . Por lo tanto, dado que 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.

Véase también

Referencias

  1. ^ ab M. Bellare, J. Kilian y P. Rogaway. La seguridad del código de autenticación de mensajes mediante encadenamiento de bloques cifrados. JCSS 61(3):362–399, 2000.
  2. ^ ab Cliff, Boyd y González Nieto 2009, pág. 5.
  3. ^ RFC  4309 Uso del modo CCM del Estándar de cifrado avanzado (AES) con carga útil de seguridad encapsulada (ESP) de IPsec
  4. ^ RFC  6655 Conjuntos de cifrados AES-CCM para seguridad de la capa de transporte (TLS)
  5. ^ "Seguridad de bajo consumo de energía de Bluetooth". Archivado desde el original el 2016-04-02 . Consultado el 2017-04-20 .
  6. ^ Caswell, Matt (4 de mayo de 2017). "Uso de TLS1.3 con OpenSSL". Blog de OpenSSL . Consultado el 11 de octubre de 2024 .
  7. ^ Preneel y van Oorschot 1999, pág. 7.
  8. ^ abc Consulte la sección 5 de Bellare, et al.
  9. ^ 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 bloques, cláusula 6.1.3 Método de relleno 3
  10. ^ C. Rackoff y S. Gorbunov. Sobre la seguridad del código de autenticación de mensajes en cadena de bloques.
  11. ^ http://spark-university.s3.amazonaws.com/stanford-crypto/slides/05.3-integrity-cbc-mac-and-nmac.pptx Archivado el 22 de abril de 2017 en Wayback Machine [ URL simple ]
  12. ^ Por qué odio el CBC-MAC por Matthew D. Green
  13. ^ Introducción a la criptografía moderna, segunda edición de Jonathan Katz y Yehuda Lindell

Fuentes