El código MAC de una sola clave ( OMAC ) es una familia de códigos de autenticación de mensajes construidos a partir de un cifrado de bloques muy similar al algoritmo CBC-MAC . Puede utilizarse para garantizar la autenticidad y, por lo tanto, la integridad de los datos. Se definen dos versiones:
- El OMAC original de febrero de 2003, que rara vez se utiliza. [1] El nombre preferido ahora es "OMAC2". [2]
- El refinamiento de OMAC1, [2] que se convirtió en una recomendación del NIST en mayo de 2005 bajo el nombre de CMAC . [3]
OMAC es gratuito para todos los usos: no está cubierto por ninguna patente. [4]
Historia
El núcleo del algoritmo CMAC es una variación de CBC-MAC que Black y Rogaway propusieron y analizaron bajo el nombre "XCBC" [5] y presentaron al NIST . [6] El algoritmo XCBC aborda de manera eficiente las deficiencias de seguridad de CBC-MAC, pero requiere tres claves.
Iwata y Kurosawa propusieron una mejora de XCBC que requiere menos material de clave (solo una clave) y denominaron al algoritmo resultante One-Key CBC-MAC (OMAC) en sus artículos. [1] Más tarde presentaron el OMAC1 (= CMAC), [2] un refinamiento de OMAC y un análisis de seguridad adicional. [7]
Algoritmo
Para generar una etiqueta CMAC de ℓ bits ( t ) de un mensaje ( m ) utilizando un cifrado de bloque de b bits ( E ) y una clave secreta ( k ), primero se generan dos subclaves de b bits ( k 1 y k 2 ) utilizando el siguiente algoritmo (esto es equivalente a la multiplicación por x y x 2 en un campo finito GF(2 b )). Sea ≪ el operador de desplazamiento a la izquierda estándar y ⊕ el operador exclusivo o bit a bit :
- Calcular un valor temporal k 0 = E k (0).
- Si msb( k 0 ) = 0, entonces k 1 = k 0 ≪ 1, de lo contrario k 1 = ( k 0 ≪ 1) ⊕ C ; donde C es una constante determinada que depende únicamente de b . (Específicamente, C son los coeficientes no principales del primer polinomio binario irreducible lexicográficamente de grado b con el número mínimo de unos: 0x1B para bloques de 64 bits, 0x87 para 128 bits y 0x425 para bloques de 256 bits).
- Si msb( k 1 ) = 0 , entonces k 2 = k 1 ≪ 1 , de lo contrario k 2 = ( k 1 ≪ 1) ⊕ C .
- Teclas de retorno ( k 1 , k 2 ) para el proceso de generación de MAC.
Como pequeño ejemplo, supongamos que b = 4 , C = 0011 2 y k 0 = E k (0) = 0101 2. Entonces k 1 = 1010 2 y k 2 = 0100 ⊕ 0011 = 0111 2 .
El proceso de generación de etiquetas CMAC es el siguiente:
- Dividir el mensaje en bloques de b bits m = m 1 ∥ ... ∥ m n −1 ∥ m n , donde m 1 , ..., m n −1 son bloques completos. (El mensaje vacío se trata como un bloque incompleto).
- Si m n es un bloque completo entonces m n ′ = k 1 ⊕ m n de lo contrario m n ′ = k 2 ⊕ ( m n ∥ 10...0 2 ) .
- Sea c 0 = 00...0 2 .
- Para i = 1, ..., n − 1 , calcule c i = E k ( c i −1 ⊕ m i ) .
- c n = E k ( c n −1 ⊕ m n ′)
- Salida t = msb ℓ ( c n ) .
El proceso de verificación es el siguiente:
- Utilice el algoritmo anterior para generar la etiqueta.
- Verifique que la etiqueta generada sea igual a la etiqueta recibida.
Variantes
CMAC-C1 [8] es una variante de CMAC que proporciona garantías adicionales de compromiso y seguridad de descubrimiento de contexto .
Implementaciones
- Implementación de Python : consulte el uso de la
AES_CMAC()
función en "impacket/blob/master/tests/misc/test_crypto.py" y su definición en "impacket/blob/master/impacket/crypto.py" [9] - Implementación de Ruby [10]
Referencias
- ^ ab Iwata, Tetsu; Kurosawa, Kaoru (24 de febrero de 2003). "OMAC: CBC MAC de una sola clave". Cifrado rápido de software . Apuntes de clase sobre informática. Vol. 2887. Springer, Berlín, Heidelberg. págs. 129–153. doi :10.1007/978-3-540-39887-5_11. ISBN 978-3-540-20449-7.
- ^ abc Iwata, Tetsu; Kurosawa, Kaoru (2003). "OMAC: One-Key CBC MAC – Addendum" (PDF) .
En esta nota, proponemos OMAC1, una nueva opción de los parámetros de la familia OMAC (ver [4] para los detalles). También se presentan vectores de prueba. En consecuencia, cambiamos el nombre del OMAC anterior a OMAC2. (Es decir, los vectores de prueba para OMAC2 ya se mostraron en [3].) Usamos OMAC como un nombre genérico para OMAC1 y OMAC2.
- ^ Dworkin, Morris (2016). "Recomendación para los modos de operación del cifrado de bloques: el modo CMAC para autenticación" (PDF) . doi : 10.6028/nist.sp.800-38b .
- ^ Rogaway, Phillip. "CMAC: Non-licensing" (CMAC: no concesión de licencias) . Consultado el 27 de mayo de 2020.
Declaración de Phillip Rogaway sobre el estado de propiedad intelectual de CMAC
- ^ Black, John; Rogaway, Phillip (20 de agosto de 2000). Avances en criptología: CRYPTO 2000. Springer, Berlín, Heidelberg. págs. 197–215. doi :10.1007/3-540-44598-6_12. ISBN . 978-3540445982.
- ^ Black, J; Rogaway, P. "Una sugerencia para manejar mensajes de longitud arbitraria con el CBC MAC" (PDF) .
- ^ Iwata, Tetsu; Kurosawa, Kaoru (8 de diciembre de 2003). "Límites de seguridad más sólidos para OMAC, TMAC y XCBC". En Johansson, Thomas; Maitra, Subhamoy (eds.). Avances en Criptología - INDOCRYPT 2003 . Apuntes de conferencias sobre informática. vol. 2904. Springer Berlín Heidelberg. págs. 402–415. CiteSeerX 10.1.1.13.8229 . doi :10.1007/978-3-540-24582-7_30. ISBN 9783540206095.
- ^ Bhaumik, Ritam; Chakraborty, Bishwajit; Choi, Wonseok; Dutta, Avijit; Govinden, Jérôme; Shen, Yaobin (2024). "El compromiso de seguridad de MAC con aplicaciones de composición genérica". En Reyzin, Leonid; Stebila, Douglas (eds.). Avances en Criptología – CRYPTO 2024 . Apuntes de conferencias sobre informática. vol. 14923. Cham: Springer Nature Suiza. págs. 425–462. doi :10.1007/978-3-031-68385-5_14. ISBN 978-3-031-68385-5.
- ^ "Impacket es una colección de clases de Python para trabajar con protocolos de red: SecureAuthCorp/impacket". 15 de diciembre de 2018 – vía GitHub.
- ^ "Extensión Ruby C para la función hash con clave AES-CMAC (RFC 4493): louismullie/cmac-rb". 4 de mayo de 2016 – vía GitHub.
Enlaces externos
- RFC 4493 El algoritmo AES-CMAC
- RFC 4494 El algoritmo AES-CMAC-96 y su uso con IPsec
- RFC 4615 Estándar de cifrado avanzado: código de autenticación de mensajes basado en cifrado, función pseudoaleatoria, 128 (AES-CMAC-PRF-128)
- Prueba en línea de OMAC
- Más información sobre OMAC
- Implementación de Rust