One-key MAC ( OMAC ) est une famille de codes d'authentification de messages construits à partir d'un chiffrement par bloc très similaire à l' algorithme CBC-MAC . Il peut être utilisé pour garantir l'authenticité et, par conséquent, l'intégrité des données. Deux versions sont définies :
- L'OMAC original de février 2003, qui est rarement utilisé. Le nom préféré est désormais « OMAC2 ».
- Le raffinement OMAC1, qui est devenu une recommandation NIST en mai 2005 sous le nom CMAC .
L'OMAC est libre pour toutes les utilisations : il n'est couvert par aucun brevet.
Histoire
Le cœur de l'algorithme CMAC est une variante de CBC-MAC que Black et Rogaway ont proposé et analysé sous le nom de « XCBC » et soumis au NIST . L'algorithme XCBC répond efficacement aux déficiences de sécurité de CBC-MAC, mais nécessite trois clés.
Iwata et Kurosawa ont proposé une amélioration de XCBC qui nécessite moins de matériel de clé (une seule clé) et ont nommé l'algorithme résultant One-Key CBC-MAC (OMAC) dans leurs articles. Ils ont ensuite soumis l'OMAC1 (= CMAC), un raffinement de l'OMAC et une analyse de sécurité supplémentaire.
Algorithme
Pour générer une balise CMAC de ℓ bits ( t ) d'un message ( m ) en utilisant un chiffrement par bloc de b bits ( E ) et une clé secrète ( k ), on génère d'abord deux sous-clés de b bits ( k 1 et k 2 ) en utilisant l'algorithme suivant (ce qui équivaut à une multiplication par x et x 2 dans un corps fini GF(2 b )). Soit ≪ l'opérateur standard de décalage à gauche et ⊕ l'opérateur ou exclusif bit à bit :
- Calculer une valeur temporaire k 0 = E k (0).
- Si msb( k 0 ) = 0, alors k 1 = k 0 ≪ 1, sinon k 1 = ( k 0 ≪ 1) ⊕ C ; où C est une certaine constante qui ne dépend que de b . (Plus précisément, C est le nombre de coefficients non dominants du polynôme binaire de degré b irréductible lexicographiquement premier avec le nombre minimal de uns : 0x1B pour les blocs de 64 bits, 0x87 pour les blocs de 128 bits et 0x425 pour les blocs de 256 bits.)
- Si msb( k 1 ) = 0 , alors k 2 = k 1 ≪ 1 , sinon k 2 = ( k 1 ≪ 1) ⊕ C .
- Touches de retour ( k 1 , k 2 ) pour le processus de génération MAC.
À titre d’exemple, supposons que b = 4 , C = 0011 2 et k 0 = E k (0) = 0101 2 . Alors k 1 = 1010 2 et k 2 = 0100 ⊕ 0011 = 0111 2 .
Le processus de génération de balises CMAC est le suivant :
- Diviser le message en blocs de b bits m = m 1 ∥ ... ∥ m n −1 ∥ m n , où m 1 , ..., m n −1 sont des blocs complets. (Le message vide est traité comme un bloc incomplet.)
- Si m n est un bloc complet alors m n ′ = k 1 ⊕ m n sinon m n ′ = k 2 ⊕ ( m n ∥ 10...0 2 ) .
- Soit c 0 = 00...0 2 .
- Pour i = 1, ..., n − 1 , calculer c i = E k ( c i −1 ⊕ m i ) .
- c n = E k ( c n −1 ⊕ m n ′)
- Sortie t = msb ℓ ( c n ) .
Le processus de vérification est le suivant :
- Utilisez l'algorithme ci-dessus pour générer la balise.
- Vérifiez que la balise générée est égale à la balise reçue.
Variantes
CMAC-C1 est une variante de CMAC qui fournit des garanties de sécurité supplémentaires en matière d'engagement et de découverte de contexte .
Implémentations
- Implémentation Python : voir l'utilisation de la
AES_CMAC()fonction dans « impacket/blob/master/tests/misc/test_crypto.py », et sa définition dans « impacket/blob/master/impacket/crypto.py » - Implémentation de Ruby