stringtranslate.com

CBC-MAC

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 (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 de cifrado (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 sin formato provocará que el bloque cifrado final cambie de una manera que no se puede predecir ni contrarrestar sin conocer la clave del cifrado del bloque.

Construcción CBC-MAC

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 bloques que utilizan una clave secreta k y un cifrado de bloque E : CBC-MAC por sí solo no es seguro para mensajes de longitud variable [1] (consulte la discusión a continuación) y actualmente se utiliza para construir una familia de funciones pseudoaleatorias [2] y como componente del modo CCM .

Uso en estándares

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] también. 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 "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 La autenticación de datos informáticos 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 se incluye 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í solo, 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) empareja dos mensajes y puede generar un tercer mensaje cuyo CBC-MAC también será . Esto simplemente se hace aplicando XOR en el primer bloque de con t y luego concatenando m con este modificado ; es decir, haciendo . Al calcular la MAC para el mensaje , se deduce que calculamos la MAC para m de la manera habitual como t , pero cuando este valor se encadena hacia la etapa de cálculo, realizaremos una operación OR exclusiva con el valor derivado para la MAC de el 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 is .

Este problema no se puede resolver agregando un bloque del tamaño de un 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) Anteponer longitud; 3) Cifre 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.

Longitud antepuesta

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 nunca 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 es posible que no se conozca la longitud del mensaje cuando comienza el procesamiento.

Cifrar el último bloque

Cálculo de CBC-MAC Encrypt-último bloque.

Cifrar el ú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 discutidos para extender CBC-MAC a mensajes de longitud variable, encrypt-last-block tiene la ventaja de no necesitar conocer la longitud del mensaje hasta el final del cálculo.

Métodos de ataque contra el uso incorrecto

Como ocurre 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 del CBC-MAC. [12]

Usar la misma clave para cifrado y autenticación

Un error común es reutilizar la misma clave k para el cifrado CBC y CBC-MAC. Aunque reutilizar una clave para distintos fines es una mala práctica en general, en este caso particular el error desemboca en un ataque espectacular:

Supongamos que Alice le ha enviado a Bob los bloques de texto cifrado . Durante el proceso de transmisión, Eve puede alterar cualquiera de los bloques de texto cifrado y ajustar cualquiera de los bits que contiene a su gusto, 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 reciba el mensaje, primero lo descifrará 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 Alice envió originalmente, porque Eve ha modificado todo excepto el último bloque de texto cifrado. En particular, el texto plano final, difiere del original, que envió Alice; aunque es el mismo, por lo que se produce un texto sin formato diferente al encadenar el bloque de texto cifrado anterior en el OR exclusivo después de descifrar : .

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 para el nuevo mensaje, viene dada por:

Observe que esta expresión es igual a

que es exactamente :

y se sigue eso .

Por lo tanto, Eve pudo modificar el texto cifrado en tránsito (sin saber necesariamente a qué texto sin formato 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 fue sin saber que el contenido había sido modificado durante el transporte. 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 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 haciéndole creer que Alice le envió un mensaje que ella 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 sin formato . Sin embargo, debido al uso de una clave diferente por parte del MAC , no podemos "deshacer" el proceso de descifrado en el paso adelante del cálculo del código de autenticación del mensaje para producir la misma etiqueta; cada modificación ahora será cifrada en el proceso CBC-MAC con 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 "hashee" la misma etiqueta.

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

Al cifrar datos utilizando un cifrado de bloque en 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 aleatoriamente (un nonce ) y que no se repita para ninguna clave secreta determinada 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.

Al calcular un código de autenticación de mensaje, como por ejemplo mediante 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 usando un OR exclusivo ( ). El resultado de esta operación es la entrada al cifrado de bloque para su cifrado.

Sin embargo, al realizar el cifrado y descifrado, debemos enviar el vector de inicialización en texto sin formato (generalmente como el bloque inmediatamente anterior al primer bloque de texto cifrado) de manera que el primer bloque de texto sin formato se pueda descifrar y recuperar exitosamente. Si calculamos 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 en el 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 produzca el mensaje . Para cada bit modificado , 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 para este mensaje, comenzamos el cálculo con . Como los bits tanto del texto plano 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 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 modificaciones arbitrarias 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 usará 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 usará para la verificación. Por ejemplo, si el atacante ha observado el mensaje con y lo 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). Alternativamente, se puede utilizar MAC en modo CFB, porque en modo CFB el IV se cifra antes de realizar XOR con los datos.

Otra solución (en caso de que no se requiera protección contra ataques de reproducción de mensajes) es utilizar siempre un IV de vector cero. [13] Tenga en cuenta que la fórmula anterior para se convierte en . Entonces, 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.

Ver también

Referencias

  1. ^ ab M. Bellare, J. Kilian y P. Rogaway. La seguridad del código de autenticación de mensajes de encadenamiento de bloques cifrados. JCSS 61(3):362–399, 2000.
  2. ^ ab Cliff, Boyd y González Nieto 2009, p. 5.
  3. ^ RFC  4309 utilizando el modo CCM del estándar de cifrado avanzado (AES) con carga útil de seguridad encapsulada (ESP) IPsec
  4. ^ RFC  6655 Conjuntos de cifrado AES-CCM para seguridad de la capa de transporte (TLS)
  5. ^ "Seguridad de Bluetooth de bajo consumo energético". Archivado desde el original el 2 de abril de 2016 . Consultado el 20 de abril de 2017 .
  6. ^ Caswell, Matt (4 de mayo de 2017). "Uso de TLS1.3 con OpenSSL". Blog OpenSSL . Consultado el 29 de diciembre de 2018 .
  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 bloque, 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 desnuda ]
  12. ^ Por qué odio CBC-MAC por Matthew D. Green
  13. ^ Introducción a la criptografía moderna, segunda edición de Jonathan Katz y Yehuda Lindell

Fuentes