MAC de uma chave - One-key MAC
O MAC de uma chave ( OMAC ) é um código de autenticação de mensagem construído a partir de uma cifra de bloco muito semelhante ao algoritmo CBC-MAC .
Oficialmente, existem dois algoritmos OMAC (OMAC1 e OMAC2) que são essencialmente os mesmos, exceto por um pequeno ajuste. OMAC1 é equivalente ao CMAC , que se tornou uma recomendação do NIST em maio de 2005.
É gratuito para todos os usos: não é coberto por nenhuma patente. Na criptografia , o CMAC é um algoritmo de código de autenticação de mensagem baseado em cifra de bloco . Pode ser usado para garantir a autenticidade e, portanto, a integridade dos dados. Este modo de operação corrige deficiências de segurança do CBC-MAC (o CBC-MAC é seguro apenas para mensagens de comprimento fixo).
O núcleo do algoritmo CMAC é uma variação do CBC-MAC que Black e Rogaway propuseram e analisaram sob o nome de XCBC e submetidos ao NIST . O algoritmo XCBC aborda com eficiência as deficiências de segurança do CBC-MAC, mas requer três chaves. Iwata e Kurosawa propuseram uma melhoria do XCBC e nomearam o algoritmo resultante One-Key CBC-MAC ( OMAC ) em seus trabalhos. Posteriormente, eles enviaram o OMAC1, um refinamento do OMAC, e uma análise de segurança adicional. O algoritmo OMAC reduz a quantidade de material chave necessário para XCBC. CMAC é equivalente a OMAC1.
Para gerar uma etiqueta CMAC de ℓ bits ( t ) de uma mensagem ( m ) usando uma cifra de bloco de b- bits ( E ) e uma chave secreta ( k ), primeiro gera-se duas subchaves de b- bits ( k 1 e k 2 ) utilizando o seguinte algoritmo (isto é equivalente a multiplicação por x e x 2 num campo finito GF (2 b )). Deixe ≪ denotar o operador padrão de deslocamento à esquerda e ⊕ denotar bit a bit exclusivo ou :
- Calcule um valor temporário k 0 = E k (0).
- Se msb ( k 0 ) = 0, então k 1 = k 0 ≪ 1, caso contrário k 1 = ( k 0 ≪ 1) ⊕ C ; onde C é uma certa constante que depende apenas de b . (Especificamente, C representa os coeficientes não levando do degree- lexicograficamente primeiro irredutível b polinomial binário com o número mínimo de ones:. 0x1B para 64 bits, 0x87 para 128 bits, e 0x425 para os blocos de 256-bit)
- Se MSB ( k 1 ) = 0 , então k 2 = k 1 «1 , mais k 2 = ( k 1 « 1) ⊕ C .
- Chaves de retorno ( k 1 , k 2 ) para o processo de geração de MAC.
Como um pequeno exemplo, suponhamos que b = 4 , C = 0011 2 , e k 0 = E K (0) = 0101 2 . Então k 1 = 1010 2 e k 2 = 0100 ⊕ 0011 = 0111 2 .
O processo de geração de tags CMAC é o seguinte:
- Divida a mensagem em blocos de b- bits m = m 1 ∥ ... ∥ m n −1 ∥ m n , onde m 1 , ..., m n −1 são blocos completos. (A mensagem vazia é tratada como um bloco incompleto.)
- Se m n for um bloco completo, então m n ′ = k 1 ⊕ m n senão m n ′ = k 2 ⊕ ( m n ∥ 10 ... 0 2 ) .
- Seja 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 ′)
- Saída t = msb ℓ ( c n ) .
O processo de verificação é o seguinte:
- Use o algoritmo acima para gerar a tag.
- Verifique se o tag gerado é igual ao tag recebido.
Implementações
-
Implementação do Python : veja o uso da
AES_CMAC()
função em " impacket / blob / master / tests / misc / test_crypto.py " e sua definição em " impacket / blob / master / impacket / crypto.py " - Implementação Ruby