-
No último segmento, falamos sobre o CBC-MAC eo NMAC, mas em todo
-
segmento a que sempre assumido que o comprimento da mensagem foi um múltiplo do bloco
-
tamanho. Neste segmento, vamos ver o que fazer quando o comprimento da mensagem não é
-
um múltiplo do tamanho do bloco. Então, lembrar que a CBC mac criptografado ou ECBC-MAC para
-
usos curtas pseudo-F permutação de realmente computar a função CBC como nós
-
discutido no último segmento. Mas, no último segmento, sempre assumido que o
-
própria mensagem pode ser dividida em um número inteiro de blocos para o bloco
-
cifra. E a pergunta é o que fazer quando o comprimento da mensagem não é um múltiplo
-
do tamanho do bloco. Portanto, temos aqui uma mensagem onde o último bloco é realmente
-
menor do que o bloco inteiro ea questão é como calcular o ECBC-MAC em
-
caso disso. Portanto, a solução de curso é a mensagem de almofada ea almofada primeiro que
-
me vem à mente é simplesmente pad a mensagem com todos os zeros. Em outras palavras, assumir a
-
último bloco e adicionar apenas zeros a ele até o último bloco torna-se, enquanto um total
-
tamanho do bloco. E por isso a minha pergunta é se o MAC resultante é seguro. Assim
-
, a resposta é não, o MAC não é seguro. E deixe-me explicar por que, basicamente, o
-
problema é que é possível agora avançar com mensagens para que m mensagem e do
-
m mensagem concatenada de zero acontecer de ter exatamente o mesmo Pad. E, como resultado, uma vez
-
nos ligar tanto m e m | | 0 em ECBC vamos tirar o mesmo tag, o que significa que
-
tanto m e m | | 0 tem a mesma marca e, portanto, o atacante pode
-
montar uma falsificação existencial. Pedia a tag na mensagem m. E então ele
-
geraria como falsificação da marca ea mensagem m | | 0. E é
-
fácil dizer por que é o caso. Basicamente, para ser absolutamente claro aqui, temos a nossa
-
m mensagem. Que após enchimento torna-se M000. Então tivemos que adicionar três
-
0 é para ele. E aqui temos a mensagem m zero, um m que termina com zero. E depois
-
estofamento, basicamente agora tem que adicionar dois 0 a ele. E eis que, tornam-se
-
no mesmo bloco, de modo que vamos ter exatamente a mesma tag que permite que o
-
adversário para montar o ataque falsificação existencial. Então isso não é uma boa idéia. Em
-
fato anexando todos os 0s é uma idéia terrível. E se você pensa sobre o caso concreto onde
-
isso vem se imaginar o sistema de compensação automática de casa usada para limpar
-
cheques. Eu poderia ter um cheque de US $ 100 e marca nessa seleção. Bem, agora, o
-
atacante basicamente poderia acrescentar um zero para o meu cheque e torná-lo um cheque de US $ 1000,
-
e que não iria realmente mudar a marca. Portanto, esta capacidade de estender a mensagem
-
sem alterar a tag na verdade poderia ter consequências bastante desastrosas. Então, eu
-
espero que este exemplo convence que a função de preenchimento em si deve ser um a
-
uma função. Em outras palavras, deve ser o caso que duas mensagens distintas sempre
-
mapa para duas distintas mensagens acolchoados. Não devemos realmente ter uma colisão no
-
função de preenchimento. Outra maneira de dizer é que a função de preenchimento deve ser
-
inversível. Isso garante que a função de preenchimento é 1-1. Assim, um
-
maneira padrão de fazer isso foi proposto pela Organização Internacional de Normalização
-
ISO. O que eles sugerem é, basicamente, vamos acrescentar a string 100000 para o fim
-
da mensagem para tornar a mensagem ser um múltiplo do comprimento do bloco. Agora, para ver
-
que este preenchimento é inversível, tudo o que fazemos é descrever o algoritmo de inversão
-
que simplesmente vai digitalizar a mensagem da direita para a esquerda, até atingir o
-
primeiro e então ele vai remover todos os bits para a direita deste,
-
incluindo a um. E você vê que uma vez nós removemos o padrão dessa maneira, nós
-
obter a mensagem original. Então aqui está um exemplo, então temos aqui uma mensagem onde
-
o último bloco acontece ser mais curto do que o comprimento do bloco, e então
-
acrescentar a string 1,0,0 a ele. É muito fácil ver o que o bloco é,
-
basta olhar para o primeiro da direita, podemos remover esta almofada e recuperar
-
costas mensagem original. Agora há um caso de canto que é realmente muito
-
importante, e é isso que vamos fazer se o comprimento da mensagem original já é o
-
múltiplo de um tamanho de bloco? Nesse caso é realmente muito, muito importante que nós
-
adicionar um bloco simulado extra. Que contém o bloco 1000. E novamente, eu não posso te dizer
-
quantos produtos e padrões que realmente cometeram esse erro, onde
-
não adicionar um bloco de manequim e, como resultado, o MAC é inseguro porque existe um
-
ataque de falsificação de fácil existencial. E deixe-me mostrar-lhe porquê. Então, suponho que no caso do
-
mensagem é um múltiplo de uma extensão do bloco, vamos supor que não adicionar um bloco de manequim e nós
-
literalmente MAC-ed esta mensagem aqui. Bem, o resultado agora é que se você olhar para
-
mensagem o que é um múltiplo do tamanho do bloco e uma mensagem de que não é um
-
múltiplo do tamanho do bloco, mas será preenchido com o tamanho do bloco, e imaginá-lo assim
-
acontece que esta mensagem m um primo acontece a terminar com 1-0-0. Neste ponto,
-
você perceber que aqui, a mensagem original. Aqui, deixe-me chamar assim.
-
Você percebe que a mensagem original após o preenchimento. Seria idêntico ao
-
a segunda mensagem que não foi preenchido em tudo. E, como resultado, se eu pedir a tag
-
sobre esta mensagem por aqui, gostaria de obter também a tag na segunda mensagem que
-
aconteceu para terminar em 1-0-0. Ok, então se não adicionar o bloco de manequim, basicamente,
-
, novamente, o teclado não seria inversível, porque duas mensagens diferentes, duas
-
mensagens distintas, acontecer para mapear para o mesmo resultado acolchoada. Novamente, como resultado,
-
do MAC torna-se inseguro. Então, para resumir, essa norma ISO é uma maneira perfeitamente bem
-
para almofada, exceto que você tem que se lembrar também de adicionar um bloco de manequim na mensagem caso é um
-
múltiplo do comprimento do bloco, para começar. Agora alguns de vocês podem estar se perguntando
-
se existe um esquema de preenchimento que nunca necessita de adicionar um bloco simulado, ea resposta
-
é que se você olhar para uma função de preenchimento determinista, então é muito fácil
-
argumentam que sempre haverá casos em que precisamos para preencher, ea razão é
-
apenas literalmente o número de mensagens que são múltiplos de o comprimento do bloco é muito
-
menor do que o número total de mensagens que não precisam de ser um múltiplo do bloco
-
comprimento. E, como resultado, não podemos ter uma função 1-1 a partir desta maior
-
conjunto de todas as mensagens para o menor conjunto de mensagens que são um múltiplo de
-
comprimento do bloco. Sempre haverá casos em que temos que estender o original
-
comprimento do bloco. Sempre haverá casos em que temos que estender o original
-
bloco. No entanto, existe uma ideia muito inteligente chamada CMAC que mostra que o uso de um
-
função de preenchimento aleatório podemos evitar de ter que sempre adicionar um bloco de manequim. E assim
-
deixe-me explicar como CMAC funciona. Então CMAC realmente usa três chaves. E, na verdade,
-
às vezes isso é chamado de construção chave três. Portanto, esta primeira chave, K, é
-
usado na CBC, o padrão CBC algoritmo MAC. E então as chaves, K1 e K2,
-
são usados apenas para o esquema de preenchimento no bloco muito, muito passado. E de fato, em
-
o padrão CMAC, as chaves de K1, K2 são derivadas da chave K por algum tipo de uma
-
gerador pseudo-aleatório. Assim, a maneira CMAC funciona é como se segue. Bem, se a mensagem
-
acontece a não ser um múltiplo de uma extensão do bloco, em seguida, nós adicionamos o preenchimento ISO para
-
-lo. Mas então também XOR este último bloco com uma chave secreta, K1, que o
-
adversário não sabe. No entanto, se a mensagem é um múltiplo do comprimento do bloco,
-
, então, naturalmente, não acrescentar nada para ele. Mas nós XOR-lo com um diferente
-
chave, K2, que, mais uma vez, o adversário realmente não sei. Então não é que,
-
apenas fazendo isso, agora é impossível aplicar os ataques de extensão que pudéssemos
-
fazer a função de cascata, e em CBC-prima. Porque o pobre
-
adversário realmente não sabe o que é o último bloco que entrou na
-
função. Ele não sabe K1, e, portanto, que não sabe o valor no presente
-
determinado ponto e, como resultado, ele não pode fazer um ataque de extensão. De facto, este é um
-
declaração demonstrável. E para que essa construção aqui é simplesmente XOR-ing
-
K1 ou XOR-ing K2 é realmente um PRF. Apesar de não ter que fazer uma final
-
passo de criptografia após a função prima CBC é computado. Então, essa é uma
-
benefício, que não há criptografia passo final. E a segunda vantagem é que podemos resolver
-
ambigüidade entre este se preenchimento ou preenchimento aconteceu não aconteceu por meio
-
duas chaves diferentes para distinguir o caso em que a mensagem é um múltiplo do bloco
-
comprimento versus o caso em que não há mas não temos uma almofada anexado à mensagem. Assim
-
as duas chaves diferentes resolver este ambiguidade entre os dois casos, e como um
-
resultado, este preenchimento, na verdade é suficientemente seguro. E como eu disse,
-
há realmente um teorema de segurança legal que vai com CMAC que mostra que o
-
construção CMAC é realmente uma função pseudo-aleatória, com a mesma segurança
-
propriedades como CBC-MAC. Então, eu queria mencionar que CMAC é um padrão federal
-
padronizado pelo NIST e se você agora, nestes dias, queria usar um CBC-MAC para
-
qualquer coisa, você realmente estar usando CMAC como a forma padrão para fazê-lo. Mas
-
particularmente em CMAC, a cifra de bloco AES é subjacente e que nos dá uma segura
-
CBC-MAC derivado de AES. Então esse é o final no segmento e no próximo segmento
-
vamos falar sobre um MAC paralelo.