# CBC-MAC

Em criptografia, uma cifra de block encadeada para autenticação de messagens (CBC-MAC), é uma técnica para construção de um MAC para uma cifra de bloco. A mensagem é criptografada com alguma algoritmo de cifra de bloco em modo de operação CBC para criar cadeias de blocos com as quais cada bloco depende da construção do bloco anterior. Esta interdependência garante que qualquer alteração no puro-texto original causará uma modificação no último bloco do cifro-texto de maneira imprevisível para quem não conhece a chave da cifra de bloco utilizada.
Para calcular CBC-MAC de uma mensagem $m$ é preciso criptografar $m$ no modo CBC com um vetor de inicialização de zeros. A figura seguir detalha a computação do CBC-MAC de uma mensagem composta de $m_{1}\|m_{2}\|\cdots \|m_{x}$ utilizando uma chave secreta $k$ e uma cifra de bloco $E$:

## Segurança para mensagens de tamanho fixo e variável

Se uma cifra de bloco utilizada é segura, ou seja é uma permutação pseudoaleatória, então o CBC-MAC é seguro para mensagens de tamanho fixo. Contudo, para cadeias de tamanho variáveis este não é seguro. Logo, uma chave deve ser utilizada apenas uma vez para mensagens de tamanho fixo. Isto decore do fato que um atacante que conhece o par mesagem e o seu respectivo identificador (i.e. CBC-MAC) $(m,$ $t)$ and $(m',$ $t')$ poder gerar uma terceira mensagem $m''$ cujo CBC-MAC também será $t'$. Isto é realizado aplicado XOR ao primeiro bloco $m'$ com $t$ e depois concatenando $m$ com o seu respectivo $m'$ modificado; isto é, fazendo $m''=m\|[(m_{1}'\oplus t)\|m_{2}'\|\dots \|m_{x}']$.
Tal problema não pode ser solucionado adicionando um bloco ao final com o tamanho da mensagem. Existem três maneiras de modificar o CBC-MAC para que este se torne seguro para mensagens de tamanho variável. Uma solução é incluir o tamanho da mensagem no primeiro bloco; de fato o CBC-MAC tem se mostrado quando duas mensagens que não sejam uma prefixo da outra nunca é utilizado e adicionar o tamanho é um caso específico disto. Em tal caso, também é recomendado o uso de um diferente tipo de operação tal como CMAC ou HMAC para proteger a integridade de mensagens de tamanho variável.

## Utilizando a mesma chave para criptografia e authenticação

Um erro comum é reutilizar a mesma chave $k$ para o modo de criptografia CBC e para CBC-MAC. Além do reuso de senhas ser uma prática não recomendada, para este caso específico isto também implica é um ataque astucioso. Suponha que a mensagem $m_{0}\|m_{1}\|\cdots \|m_{x-1}$ seja criptografada no modo CBC utilizando um $IV_{c-1}$ e resulta no seguinte cifro-texto: $c_{0}\|c_{1}\|\cdots \|c_{x-1}$, onde $c_{i}=E_{k}(m_{i}\oplus c_{i-1})$. Também é gerado um identificador CBC-MAC para o IV e a mensagem: $t=M(m_{-1}\|\cdots \|m_{x-1}).$. Agora um atacante pode modificar cada bit antes do último bloco $c_{x-1}$ e o identificador MAC ainda sim será válido. A razão é que $t=E_{k}(m_{x-1}\oplus c_{x-2})=c_{x-1}$. Uma vez que o último bloco não é modificado a equivalência $t=c_{x-1}$ é mantida e o CBC-mac correto.
Este exemplo também demonstra o motivo pelo qual o CBC-MAC não pode ser utilizado como uma função unidirecional resistente a colisão (função hash); dada uma chave, é trivial forjar uma mensagem cujo identificador é o mesmo da mensagem original.