Certamente, o uso de cifras de bloco para construir funções hash e códigos de autenticação de mensagens (MACs) é uma prática bem estabelecida no campo da criptografia. Uma cifra de bloco é uma cifra de chave simétrica que opera em blocos de dados de tamanho fixo usando uma chave secreta compartilhada. Exemplos de cifras de bloco incluem o Advanced Encryption Standard (AES) e o Data Encryption Standard (DES). Essas cifras são projetadas principalmente para criptografia e descriptografia, mas suas propriedades podem ser aproveitadas para criar outras primitivas criptográficas, como funções hash e MACs.
Funções Hash de Cifras de Bloco
Uma função hash criptográfica é um algoritmo determinístico que mapeia uma quantidade arbitrária de dados para uma sequência de bytes de tamanho fixo. A saída, conhecida como valor hash, deve ter várias propriedades principais: deve ser computacionalmente inviável reverter (resistência à pré-imagem), encontrar duas entradas diferentes que produzam a mesma saída (resistência à colisão) ou encontrar uma entrada diferente que produza o mesmo saída como uma determinada entrada (segunda resistência de pré-imagem).
Construção Merkle-Damgård
Um dos métodos mais conhecidos para construir uma função hash a partir de uma cifra de bloco é a construção Merkle-Damgård. Este método usa uma cifra de bloco em um modo específico de operação para processar os dados de entrada em blocos.
1. Inicialização: comece com um valor inicial, conhecido como vetor de inicialização (IV).
2. Tratamento: divida a mensagem de entrada em blocos de tamanho fixo. Para cada bloco, use a cifra de bloco para transformar o estado atual.
3. Finalização: Após processar todos os blocos, o estado final é o valor hash.
Por exemplo, deixe
ser uma cifra de bloco,
uma chave,
o vetor de inicialização, e
a mensagem dividida em blocos
. A função hash
pode ser definido da seguinte forma:
![]()
Essa construção garante que a função hash herde as propriedades de segurança da cifra de bloco subjacente, assumindo que a cifra de bloco seja segura.
Construção Davies-Meyer
Outro método popular é a construção de Davies-Meyer, que usa uma cifra de bloco de maneira feed-forward para construir uma função hash. A construção é definida da seguinte forma:
![]()
Onde
é o valor do hash após o processamento do
-ésimo bloco,
é a função de criptografia de cifra de bloco com chave
e
denota a operação XOR bit a bit. O valor inicial
normalmente é definido como uma constante fixa.
Códigos de autenticação de mensagens (MACs) de cifras de bloco
Um Código de Autenticação de Mensagem (MAC) é uma pequena informação usada para autenticar uma mensagem e garantir sua integridade. Um algoritmo MAC recebe como entrada uma mensagem e uma chave secreta e gera uma tag MAC. O destinatário, que também possui a chave secreta, pode verificar a autenticidade da mensagem recalculando a etiqueta MAC e comparando-a com a etiqueta recebida.
CBC-MAC
Um dos métodos mais simples e amplamente utilizados para construir um MAC a partir de uma cifra de bloco é o Cipher Block Chaining Message Authentication Code (CBC-MAC). Este método usa o modo CBC de operação de uma cifra de bloco para processar a mensagem, e o bloco final é usado como tag MAC.
1. Inicialização: Comece com um vetor de inicialização (IV) definido como zero.
2. Tratamento: criptografe cada bloco da mensagem usando a cifra de bloco no modo CBC.
3. Finalização: A saída da criptografia de bloco final é a tag MAC.
Por exemplo, deixe
ser uma cifra de bloco,
uma chave,
a mensagem dividida em blocos
e
o vetor de inicialização. A etiqueta CBC-MAC
é calculado da seguinte forma:
![]()
![]()
![]()
A segurança do CBC-MAC depende da exclusividade do comprimento da mensagem e da chave. Para garantir a segurança, recomenda-se a utilização de chaves diferentes para criptografia e geração de MAC.
HMAC
Outra construção MAC amplamente utilizada é o Código de Autenticação de Mensagem Baseado em Hash (HMAC), que pode ser construído usando uma função hash baseada em cifra de bloco. O HMAC oferece melhores propriedades de segurança e é mais robusto contra certos tipos de ataques.
HMAC é definido da seguinte forma:
![]()
Onde:
-
é uma função hash (por exemplo, uma construída usando uma cifra de bloco).
-
É a chave
preenchido com o tamanho do bloco da função hash.
-
denota a operação XOR bit a bit.
-
e no
são constantes de preenchimento fixas.
-
denota concatenação.
Considerações de Segurança
Ao usar cifras de bloco para construir funções hash e MACs, diversas considerações de segurança devem ser levadas em consideração:
1. Gerenciamento de chaves: A segurança das construções depende do sigilo da chave. Práticas adequadas de gerenciamento de chaves devem ser seguidas para garantir que as chaves não sejam comprometidas.
2. Resistência à colisão: Para funções hash, a resistência à colisão é importante. A cifra de bloco deve ser segura contra ataques que possam levar a colisões na função hash.
3. Comprimento da Mensagem: Para CBC-MAC, a segurança pode ser comprometida se a mesma chave for usada para mensagens de comprimentos diferentes. É importante garantir que a chave seja exclusiva para cada comprimento de mensagem ou usar técnicas adicionais para lidar com mensagens de comprimento variável.
4. Acolchoamento: Esquemas de preenchimento adequados devem ser usados para garantir que os blocos de mensagens tenham o tamanho correto para a cifra de bloco. O preenchimento incorreto pode levar a vulnerabilidades de segurança.
5. Desempenho: O desempenho das construções depende da eficiência da cifra de bloco subjacente. Cifras de bloco de alto desempenho, como AES, são preferidas para implementações práticas.
Exemplos Práticos
Exemplo de CBC-MAC
Considere uma cifra de bloco
com um tamanho de bloco de 128 bits e uma chave
. Deixe a mensagem
seja "Olá, mundo!" preenchido até o tamanho de bloco mais próximo. A mensagem é dividida em blocos
, e a tag CBC-MAC é calculada da seguinte forma:
1. Inicialização: ![]()
2. Tratamento:
- ![]()
- ![]()
3. Finalização: ![]()
A etiqueta resultante
é usado como o MAC da mensagem.
Exemplo de HMAC
Considere uma função hash
construído usando uma cifra de bloco com tamanho de bloco de 512 bits. Deixe a chave
seja "secretkey" e a mensagem
seja "Olá, mundo!". A tag HMAC é calculada da seguinte forma:
1. Preenchimento de teclas: Aperte a tecla
ao tamanho do bloco da função hash para obter
.
2. Hash Interno: Calcule o hash interno:
- ![]()
3. Hash externo: Calcule o hash externo:
- ![]()
A etiqueta resultante
é o HMAC da mensagem.
As cifras de bloco são primitivas criptográficas versáteis que podem ser usadas para construir funções hash e MACs. As construções Merkle-Damgård e Davies-Meyer são métodos populares para construir funções hash a partir de cifras de bloco, enquanto CBC-MAC e HMAC são construções MAC amplamente utilizadas. A segurança dessas construções depende das propriedades da cifra de bloco subjacente, do gerenciamento adequado de chaves e da adesão às melhores práticas na implementação criptográfica.
Outras perguntas e respostas recentes sobre Aplicações de cifras de bloco:
- O que uma cifra de bloco deve incluir de acordo com Shannon?
- A segurança das cifras de bloco depende muitas vezes da combinação de operações de confusão e difusão?
- Difusão significa que pedaços individuais de texto cifrado são influenciados por muitos pedaços de texto simples?
- O modo BCE divide grandes textos simples de entrada em blocos subsequentes?
- O modo OFB pode ser usado como geradores de keystream?
- Uma criptografia pode ser determinística?
- Quais são os modos de operação?
- O que o modo BCE faz com cifras de bloco simples
- O PSRNG pode ser feito por cifras de bloco?
- Um MAC pode ser construído por cifras de bloco?
Veja mais perguntas e respostas em Aplicações de cifras de bloco

