Algoritmos para Códigos de Autenticação de Mensagens 03/2010 Instituto de Computação - UNICAMP
Roteiro Códigos de Autenticação de Mensagens Construção baseada em cifras (CBC-MAC, CMAC) Construção baseada em hash (NMAC, HMAC) Autenticação e Sigilo
Introdução A autenticação de mensagens é um mecanismo ou serviço usado para verificar a integridade de uma mensagem. A autenticação garante que os dados recebidos sejam exatamente iguais aos enviados (ou seja, não contêm modificação, inserção, exclusão ou repetição) e que a identidade afirmada pelo emissor é válida. a criptografia simétrica oferece dois mecanismos criptográficos para autenticação: códigos de autenticação de mensagens (MACs) e funções de resumo.
Códigos de Autenticação de Mensagens (MACs) Encriptação não é um mecanismo de autenticação! Exemplo: em cifras de fluxo, a troca de um bit no texto encriptado resulta numa troca do mesmo bit no texto claro. 10010000 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 00010000 Um MAC é um algoritmo que recebe uma mensagem e uma chave secreta como entrada e produz um número de tamanho fixo (autenticador). Suponha que Alice e Beto compartilhem uma chave secreta k. Alice pode agora enviar uma mensagem m e um autenticador t = MAC k (m) para Beto, que pode autenticar a origem e o conteúdo de m recalculando t.
Construção de Códigos de Autenticação de Mensagens (MACs) Um MAC pode ser construído usando uma cifra de bloco no modo de operação CBC: CBC-MAC (mensagem de comprimento fixo): IV = 0...0. CBC-MAC (variante que usa o comprimento da mensagem ou duas chaves) CMAC (padrão NIST) Um MAC pode ser construído usando funções de resumo: NMAC, HMAC.
Construção de MACs (tentativas) Seja F (b, k) um cifrador de bloco. Dada uma mensagem m = (m 1, m 2,..., m n ) e uma chave k, queremos construir um algoritmo MAC(m, k): MAC(m, k) := F (m 1 m 1 m n, k) ataques: Se m = (m n,..., m 2, m 1 ), então MAC(m, k) = MAC(m, k). Se m = (m 1, m 1, m 2,..., m n, m 1 ), então MAC(m, k) = MAC(m, k). MAC(m, k) := F (m 1, k) F (m 2, k) F (m n, k) ataques: Se m = (m 1, m 1, m 2,..., m n, m 1 ), então MAC(m, k) = MAC(m, k). Se m = m m m então MAC(m, k) = MAC(m, k).
Construção de MACs (CBC) Entrada: F (b, k) um cifrador de bloco, k uma chave e m = m 1 m 2 m 3 m n uma mensagem. Saída: MAC(m, k). c 1 = F (m 1, k) c 2 = F (c 1 m 2, k) c 3 = F (c 2 m 3, k) c 4 = F (c 3 m 4, k). c n = F (c n 1 m n, k) MAC-CBC(m, k) := c n
MAC-CBC Ataque para mensagens de comprimento variável m A = a 1 a 2 a p m B = b 1 b 2 b q t a = MAC-CBC(m A ) t b = MAC-CBC(m B ) Ataque: m := a 1 a 2 a p t a b 1 b 2 b q MAC-CBC(m, k) = t b = MAC-CBC(m B, k)
MAC-CBC: comprimento variável m = m 1 m 2 m n n: comprimento em bits da mensagem m Algoritmo 1: 1. k n := F (n, k) (encriptar o comprimento da chave) 2. MAC(m, k) := MAC-CBC(m, k n ) Algoritmo 2: 1. m p := (n) 2 m 1 m 2 m n (acrescentar no início o comprimento da mensagem) 2. MAC(m, k) := MAC-CBC(m p, k) Algoritmo 3: 1. Gerar duas chaves k 1 e k 2 da chave k (Por exemplo: k 1 = F (1, k), k 2 = F (2, k)) 2. t = MAC-CBC(m, k 1 ) 3. MAC(m, k) := F (t, k 2 )
Códigos de Autenticação de Mensagen CMAC Algoritmo para geração de chaves Entrada: cifrador de bloco F (bloco, chave), tamanho do bloco b (64 ou 128), chave k, constantes R 64, R 128, onde R 128 = 0 120 10000111 e R 64 = 0 59 11011. Saída: chaves k 1 e k 2. 1. L = F (0 b, k) 2. Se msb(l) = 0 então k 1 = L 1 senão k 1 = (L 1) R b 3. Se msb(k 1 ) = 0 então k 2 = k 1 1 senão k 2 = (k 1 1) R b msb: o bit mais significativo
Códigos de Autenticação de Mensagen CMAC Algoritmo para calcular o autenticador Entrada: cifrador de bloco F (bloco, chave), tamanho do bloco b (64 ou 128), chave k, constantes R 64, R 128, onde R 128 = 0 120 10000111 e R 64 = 0 59 11011, mensagem m. Saída: t = MAC(m, k). 1. Aplique o algoritmo de geracão de chaves a k para produzir k 1 e k 2. 2. l = m (comprimento em bits da mensagem m) 3. Se l = 0 então n = 1 senão n = l/b 4. Escreva m = m 1 m 2 m n 1 m n; m i = b 5. Se m n é um bloco completo, seja m n = k 1 m n; senão m n = k 2 (m n 10 j ), onde j = nb l 1.
Códigos de Autenticação de Mensagem CMAC... /* Calculando t = MAC-CBC(m,k) */ 6. c 0 = 0 b 7. para i = 1 até n faça c i = F (c i 1 m i, k) 8. t = c n 9. devolver (t)
Código de Autenticação de Mensagem CMAC
CMAC: exemplo Cifrador: AES-128 chave: k = 2b7e1516 28aed2a6 abf71588 09cf4f3c chave k 1 = fbeed618 35713366 7c85e08f 7236a8de chave k 2 = f7ddac30 6ae266cc f90bc11e e46d513b mensagem m = 6bc1bee2 2e409f96 e93d7e11 7393172a ae2d8a57 1e03ac9c 9eb76fac 45af8e51 30c81c46 a35ce411 CMAC(m, k) = dfa66747 de9ae630 30ca3261 1497c827
Código de Autenticação de Mensagem: NMAC NMAC: Nested MAC Baseado na construção Merkle-Damgård Geração: use um algoritmo de geração de chaves G, que dado um parâmetro de nível de segurança s produz uma chave k. Escolha duas chaves k 1, k 2 {0, 1}. MAC: dada a mensagem m {0, 1} e chaves k, k 1, k 2, calcule o autenticador: t = MAC(m, k, k 1, k 2 ) = h(h k2 (m), k 1 ). Verificação: dada as chaves k, k 1, k 2, a mensagem m e o autenticador t, devolva 1 se e somente se t =? MAC(m, k, k 1, k 2 ).
Código de Autenticação de Mensagem: HMAC HMAC: Keyed-Hash Message Authentication Code Geração: use um algoritmo de geração de chaves G, que dado um parâmetro de nível de segurança s produz uma chave k. MAC: dada a mensagem m {0, 1} e chave k calcule: o autenticador t = MAC(m, k): MAC(m, k) = H IV ((k opad) H IV ((k ipad) m)). Verificação: dada a chave k, a mensagem m e o autenticador t, devolva 1 se e somente se t =? MAC(m, k).
HMAC: FIPS PUB 198 H : {0, 1} 264 {0, 1} m, 1. Se k = B, K 0 = k. Ir para passo 4 h : {0, 1} 8B {0, 1} m {0, 1} m 2. Se k > B, K 0 = H(k) 00 0. ( K 0 = B) 3. Se k < B, K 0 = k 00 0. ( K 0 = B) 4. Calcule s 0 = K 0 ipad (ipad = 0x36 B bytes) 5. Calcule s 1 = s 0 mensagem 6. Calcule h 1 = H(s 1 ) 7. Calcule s 2 = K 0 opad (opad = 0x5c B bytes) 8. Calcule s 3 = s 2 h 1 9. Calcule h 2 = H(s 3 ) 10. MAC(m, k) = os t bytes mais à esquerda de h 2.
Autenticacão e Sigilo Encriptar e Autenticar: 1. Calcular c = ENC(m, k 1 ), t = MAC(m, k 2 ) 2. Enviar: (c, t) Autenticar então encriptar: 1. Calcular t = MAC(m, k 2 ), c = ENC(m t, k 1 ) 2. Enviar: c Encriptar então Autenticar: (prova de segurança) 1. Calcular c = ENC(m, k 1 ), t = MAC(c, k 2 ) 2. Enviar: (c, t)