Preenchimento (criptografia) - Padding (cryptography)

Na criptografia , o preenchimento é qualquer uma das várias práticas distintas que incluem a adição de dados ao início, meio ou fim de uma mensagem antes da criptografia. Na criptografia clássica, o preenchimento pode incluir a adição de frases sem sentido a uma mensagem para obscurecer o fato de que muitas mensagens terminam de maneiras previsíveis, por exemplo, sinceramente as suas .

Criptografia clássica

Mensagens oficiais geralmente começam e terminam de maneiras previsíveis: Meu caro embaixador, Boletim meteorológico, Atenciosamente , etc. O principal uso do preenchimento com cifras clássicas é evitar que o criptanalista use essa previsibilidade para encontrar texto simples conhecido que ajuda a quebrar a criptografia. O preenchimento de comprimento aleatório também impede que um invasor saiba o comprimento exato da mensagem de texto simples.

Um exemplo famoso de preenchimento clássico que causou um grande mal-entendido é o incidente "as maravilhas do mundo ", que quase causou uma derrota dos Aliados na Batalha de Samar da Segunda Guerra Mundial , parte da Batalha maior do Golfo de Leyte . Nesse exemplo, o Almirante Chester Nimitz , o Comandante em Chefe da Frota do Pacífico dos EUA na Segunda Guerra Mundial, enviou a seguinte mensagem ao Almirante Bull Halsey , comandante da Força Tarefa Trinta e Quatro (a principal frota Aliada) na Batalha do Golfo de Leyte, em 25 de outubro de 1944:

Onde está, repito, onde está a Força-Tarefa Trinta e Quatro?

Com preenchimento (negrito) e metadados adicionados, a mensagem se tornou:

TURKEY TROTS TO WATER GG FROM CINCPAC ACTION COM THIRD FLEET INFO COMINCH CTF SEVENTY-SEVEN X WHERE IS RPT WHERE IS TASK FORCE THIRTY FOUR RR THE WORLD WONDERS

O operador de rádio de Halsey confundiu parte do preenchimento com a mensagem, então o Almirante Halsey acabou lendo a seguinte mensagem:

Onde está, repito, onde está a Força-Tarefa Trinta e Quatro? As maravilhas do mundo

O almirante Halsey interpretou a frase "as maravilhas do mundo" como uma repreensão sarcástica, causando-lhe uma explosão emocional e então se trancar em sua ponte e ficar de mau humor por uma hora antes de mover suas forças para ajudar na Batalha de Samar. O operador de rádio de Halsey deveria ter sido avisado pelas letras RR que "as maravilhas do mundo" estavam sendo preenchidas; todos os outros operadores de rádio que receberam a mensagem do almirante Nimitz removeram corretamente as duas frases de preenchimento.

Muitas cifras clássicas organizam o texto simples em padrões específicos (por exemplo, quadrados, retângulos, etc.) e se o texto simples não se ajusta exatamente, geralmente é necessário fornecer letras adicionais para preencher o padrão. Usar letras sem sentido para esse propósito tem o benefício colateral de tornar alguns tipos de criptoanálise mais difíceis.


Criptografia simétrica

Funções de hash

A maioria das funções hash criptográficas modernas processam mensagens em blocos de comprimento fixo; todas, exceto as funções hash mais antigas, incluem algum tipo de esquema de preenchimento. É crítico para funções de hash criptográficas empregar esquemas de terminação que evitem que um hash seja vulnerável a ataques de extensão de comprimento .

Muitos esquemas de preenchimento são baseados em anexar dados previsíveis ao bloco final. Por exemplo, o bloco pode ser derivado do comprimento total da mensagem. Este tipo de esquema de preenchimento é comumente aplicado a algoritmos de hash que usam a construção Merkle – Damgård , como MD-5 , SHA-1 e família SHA-2 , como SHA-224, SHA-256, SHA-384, SHA-512 , SHA512 / 224 e SHA-512/256

Modo de operação de cifra de bloco

O livro de código eletrônico e o modo de encadeamento de bloco de cifra (CBC) são exemplos de modo de operação de cifra de bloco . Os modos de criptografia de bloco para algoritmos de criptografia de chave simétrica requerem entrada de texto simples que seja um múltiplo do tamanho do bloco, portanto, as mensagens podem ter que ser preenchidas para chegar a esse comprimento.

Atualmente, há uma mudança para usar o modo de operação de streaming em vez do modo de operação em bloco. Um exemplo de criptografia do modo de streaming é o modo de operação do contador . Os modos de operação de streaming podem criptografar e descriptografar mensagens de qualquer tamanho e, portanto, não requerem preenchimento. Maneiras mais intrincadas de encerrar uma mensagem, como roubo de texto cifrado ou término de bloco residual, evitam a necessidade de preenchimento.

Uma desvantagem do preenchimento é que ele torna o texto simples da mensagem suscetível a ataques de oráculo de preenchimento . Os ataques de oráculo de preenchimento permitem que o invasor obtenha conhecimento do texto simples sem atacar a própria primitiva de cifra de bloco. Os ataques de oráculo de preenchimento podem ser evitados certificando-se de que um invasor não obtenha conhecimento sobre a remoção dos bytes de preenchimento. Isso pode ser feito verificando um código de autenticação de mensagem (MAC) ou assinatura digital antes da remoção dos bytes de preenchimento, ou alternando para um modo de operação de streaming.

Preenchimento de bits

O preenchimento de bits pode ser aplicado a mensagens de qualquer tamanho.

Um único conjunto de bits ('1') é adicionado à mensagem e, em seguida, tantos bits de reinicialização ('0') quantos forem necessários (possivelmente nenhum) são adicionados. O número de bits de reset ('0') adicionados dependerá do limite do bloco ao qual a mensagem precisa ser estendida. Em termos de bits, é "1000 ... 0000".

Esse método pode ser usado para preencher mensagens com qualquer número de bits, não necessariamente um número inteiro de bytes. Por exemplo, uma mensagem de 23 bits que é preenchida com 9 bits para preencher um bloco de 32 bits:

... | 1011 1001 1101 0100 0010 0111 0000 0000 |

Esse preenchimento é a primeira etapa de um esquema de preenchimento de duas etapas usado em muitas funções hash, incluindo MD5 e SHA . Neste contexto, é especificado pelo RFC1321 passo 3.1.

Este esquema de preenchimento é definido pela ISO / IEC 9797-1 como Método de preenchimento 2.

Preenchimento de bytes

O preenchimento de bytes pode ser aplicado a mensagens que podem ser codificadas como um número inteiro de bytes .

ANSI X9.23

Em ANSI X9.23, entre 1 e 8 bytes são sempre adicionados como preenchimento. O bloco é preenchido com bytes aleatórios (embora muitas implementações usem 00) e o último byte do bloco é definido como o número de bytes adicionados.

Exemplo: no exemplo a seguir, o tamanho do bloco é de 8 bytes e o preenchimento é necessário para 4 bytes (em formato hexadecimal)

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
ISO 10126

A ISO 10126 (retirada, 2007) especifica que o preenchimento deve ser feito no final daquele último bloco com bytes aleatórios, e o limite de preenchimento deve ser especificado pelo último byte.

Exemplo: no exemplo a seguir, o tamanho do bloco é de 8 bytes e o preenchimento é necessário para 4 bytes

... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
PKCS # 5 e PKCS # 7

PKCS # 7 é descrito em RFC 5652 .

O preenchimento é em bytes inteiros. O valor de cada byte adicionado é o número de bytes adicionados, ou seja, N bytes, cada um dos valores N são adicionados. O número de bytes adicionados dependerá do limite do bloco ao qual a mensagem precisa ser estendida.

O preenchimento será um dos seguintes:

01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
etc.

Este método de preenchimento (assim como os dois anteriores) é bem definido se e somente se N for menor que 256.

Exemplo: no exemplo a seguir, o tamanho do bloco é de 8 bytes e o preenchimento é necessário para 4 bytes

... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

Se o comprimento dos dados originais for um múltiplo inteiro do tamanho do bloco B , então um bloco extra de bytes com valor B é adicionado. Isso é necessário para que o algoritmo de decifração possa determinar com certeza se o último byte do último bloco é um byte de preenchimento indicando o número de bytes de preenchimento adicionados ou parte da mensagem de texto simples. Considere uma mensagem de texto simples que é um múltiplo inteiro de B bytes com o último byte de texto simples sendo 01 . Sem informações adicionais, o algoritmo de decifração não será capaz de determinar se o último byte é um byte de texto simples ou um byte de bloco. No entanto, ao adicionar B bytes de cada valor B após 01 byte de texto simples, o algoritmo de decifração pode sempre tratar o último byte como um byte de preenchimento e retirar o número apropriado de bytes de preenchimento do final do texto cifrado; dito número de bytes a serem removidos com base no valor do último byte.

O preenchimento PKCS # 5 é idêntico ao preenchimento PKCS # 7, exceto que foi definido apenas para cifras de bloco que usam um tamanho de bloco de 64 bits (8 bytes). Na prática, os dois podem ser usados ​​alternadamente.

ISO / IEC 7816-4

ISO / IEC 7816 -4: 2005 é idêntico ao esquema de preenchimento de bits, aplicado a um texto simples de N bytes. Isso significa na prática que o primeiro byte é um byte obrigatório com valor de '80' (Hexadecimal) seguido, se necessário, por 0 a N  - 1 bytes definidos como '00', até que o final do bloco seja alcançado. O próprio ISO / IEC 7816-4 é um padrão de comunicação para cartões inteligentes contendo um sistema de arquivos e, por si só, não contém especificações criptográficas.

Exemplo: no exemplo a seguir, o tamanho do bloco é de 8 bytes e o preenchimento é necessário para 4 bytes

... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

O próximo exemplo mostra um preenchimento de apenas um byte

... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |

Preenchimento zero

Todos os bytes que precisam ser preenchidos são preenchidos com zero. O esquema de preenchimento zero não foi padronizado para criptografia, embora seja especificado para hashes e MACs como Método de preenchimento 1 em ISO / IEC 10118-1 e ISO / IEC 9797-1 .

Exemplo: no exemplo a seguir, o tamanho do bloco é de 8 bytes e o preenchimento é necessário para 4 bytes

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |

O preenchimento de zero pode não ser reversível se o arquivo original terminar com um ou mais bytes de zero, tornando impossível distinguir entre bytes de dados de texto simples e bytes de preenchimento. Pode ser usado quando o comprimento da mensagem pode ser derivado fora da banda . É frequentemente aplicado a strings codificadas em binários ( string terminada em nulo ), pois o caractere nulo geralmente pode ser retirado como um espaço em branco .

O preenchimento de zero às vezes também é conhecido como "preenchimento de nulo" ou "preenchimento de zero byte". Algumas implementações podem adicionar um bloco adicional de zero bytes se o texto simples já for divisível pelo tamanho do bloco.

Criptografia de chave pública

Na criptografia de chave pública , preenchimento é o processo de preparação de uma mensagem para criptografia ou assinatura usando uma especificação ou esquema como PKCS # 1 v1.5, OAEP , PSS , PSSR, IEEE P1363 EMSA2 e EMSA5. Uma forma moderna de preenchimento para primitivas assimétricas é o OAEP aplicado ao algoritmo RSA , quando é usado para criptografar um número limitado de bytes.

A operação é chamada de "preenchimento" porque, originalmente, o material aleatório era simplesmente anexado à mensagem para torná-la longa o suficiente para o primitivo. Essa forma de preenchimento não é segura e, portanto, não é mais aplicada. Um esquema de preenchimento moderno visa garantir que o invasor não possa manipular o texto simples para explorar a estrutura matemática do primitivo e geralmente será acompanhado por uma prova, muitas vezes no modelo oráculo aleatório , de que quebrar o esquema de preenchimento é tão difícil quanto resolver o difícil problema subjacente ao primitivo.

Análise de tráfego e proteção por preenchimento

Mesmo se rotinas criptográficas perfeitas forem usadas, o invasor pode obter conhecimento da quantidade de tráfego que foi gerada. O invasor pode não saber sobre o que Alice e Bob estavam falando, mas pode saber que eles estavam conversando e o quanto conversaram. Em algumas circunstâncias, esse vazamento pode ser altamente comprometedor. Considere, por exemplo, quando um militar está a organizar um ataque secreto contra outra nação: ela pode ser suficiente para alertar a outra nação para que eles saibam apenas que não é um monte de atividade secreta acontecendo.

Como outro exemplo, ao criptografar fluxos de voz sobre IP que usam codificação de taxa de bits variável, o número de bits por unidade de tempo não é obscurecido e isso pode ser explorado para adivinhar frases faladas. Da mesma forma, os padrões de burst que os codificadores de vídeo comuns produzem geralmente são suficientes para identificar o streaming de vídeo que um usuário está assistindo com exclusividade. Até mesmo o tamanho total de um objeto sozinho, como um site da Web, arquivo, download de pacote de software ou vídeo online, pode identificar exclusivamente um objeto, se o invasor souber ou adivinhar um conjunto conhecido de onde o objeto vem. O canal lateral de comprimento de conteúdo criptografado foi usado para extrair senhas de comunicações HTTPS nos conhecidos ataques CRIME e BREACH .

O preenchimento de uma mensagem criptografada pode tornar a análise de tráfego mais difícil, obscurecendo o verdadeiro comprimento de sua carga útil. A escolha do comprimento para preencher uma mensagem pode ser feita de forma determinística ou aleatória; cada abordagem tem pontos fortes e fracos que se aplicam a contextos diferentes.

Preenchimento aleatório

Um número aleatório de bits ou bytes de preenchimento adicionais pode ser anexado ao final de uma mensagem, junto com uma indicação no final de quanto preenchimento foi adicionado. Se a quantidade de preenchimento for escolhida como um número aleatório uniforme entre 0 e algum M máximo, por exemplo, um bisbilhoteiro será incapaz de determinar o comprimento da mensagem precisamente dentro desse intervalo. Se o preenchimento máximo M for pequeno em comparação com o tamanho total da mensagem, esse preenchimento não adicionará muita sobrecarga , mas o preenchimento obscurecerá apenas os bits menos significativos do comprimento total do objeto, deixando o comprimento aproximado de objetos grandes prontamente observáveis ​​e portanto, ainda potencialmente identificáveis ​​de forma única por seu comprimento. Se o preenchimento máximo M for comparável ao tamanho da carga útil, em contraste, a incerteza de um bisbilhoteiro sobre o verdadeiro tamanho da carga útil da mensagem é muito maior, ao custo de que o preenchimento pode adicionar até 100% de sobrecarga ( 2 × explosão) para a mensagem.

Além disso, em cenários comuns em que um bisbilhoteiro tem a oportunidade de ver muitas mensagens sucessivas do mesmo remetente, e essas mensagens são semelhantes em maneiras que o invasor conhece ou pode adivinhar, então o bisbilhoteiro pode usar técnicas estatísticas para diminuir e, eventualmente, até mesmo eliminar o benefício do preenchimento aleatório. Por exemplo, suponha que o aplicativo de um usuário envie regularmente mensagens do mesmo tamanho e o bisbilhoteiro saiba ou possa adivinhar o fato com base na impressão digital do aplicativo do usuário, por exemplo. Como alternativa, um invasor ativo pode induzir um endpoint a enviar mensagens regularmente, como se a vítima fosse um servidor público. Nesses casos, o bisbilhoteiro pode simplesmente calcular a média de muitas observações para determinar o comprimento da carga útil da mensagem regular.

Preenchimento determinístico

Um esquema de preenchimento determinístico sempre preenche uma carga útil de mensagem de um determinado comprimento para formar uma mensagem criptografada de um determinado comprimento de saída correspondente. Quando muitos comprimentos de carga útil mapeiam para o mesmo comprimento de saída preenchido, um bisbilhoteiro não consegue distinguir ou aprender qualquer informação sobre o comprimento real da carga útil dentro de um desses intervalos de comprimento , mesmo depois de muitas observações das mensagens de comprimento idêntico sendo transmitidas. A esse respeito, os esquemas de preenchimento determinístico têm a vantagem de não vazar nenhuma informação adicional com cada mensagem sucessiva do mesmo tamanho de carga útil.

Por outro lado, suponha que um bisbilhoteiro possa se beneficiar ao aprender sobre pequenas variações no tamanho da carga útil, como mais ou menos um byte em um ataque de adivinhação de senha, por exemplo. Se o remetente da mensagem tiver o azar de enviar muitas mensagens cujos comprimentos de payload variam apenas em um byte, e esse comprimento está exatamente na fronteira entre duas das classes de preenchimento determinístico, então esses comprimentos de carga mais ou menos um resultarão consistentemente em diferentes também comprimentos acolchoados (mais ou menos um bloco, por exemplo), vazando exatamente as informações refinadas que o invasor deseja. Contra esses riscos, o preenchimento aleatório pode oferecer mais proteção, obscurecendo de forma independente os bits menos significativos dos comprimentos das mensagens.

Os métodos de preenchimento determinístico comuns incluem o preenchimento para um tamanho de bloco constante e o preenchimento para a próxima potência maior de dois. Como o preenchimento aleatório com uma pequena quantidade máxima  M , no entanto, o preenchimento deterministicamente para um tamanho de bloco muito menor do que a carga útil da mensagem obscurece apenas os bits menos significativos do comprimento verdadeiro da mensagem, deixando o comprimento aproximado verdadeiro da mensagem amplamente desprotegido. O preenchimento das mensagens com uma potência de dois (ou qualquer outra base fixa) reduz a quantidade máxima de informações que a mensagem pode vazar por meio de seu comprimento de O (log M ) a O (log log M ) . O preenchimento para uma potência de dois aumenta a sobrecarga do tamanho da mensagem em até 100%, no entanto, e o preenchimento para potências de bases inteiras maiores aumenta ainda mais a sobrecarga máxima.

O esquema PADMÉ, proposto para blobs aleatórios uniformes preenchidos ou PURBs , preenche deterministicamente as mensagens em comprimentos representáveis ​​como um número de ponto flutuante cuja mantissa não é mais (ou seja, não contém mais bits significativos) do que seu expoente. Essa restrição de comprimento garante que uma mensagem vaze no máximo O (log log M ) bits de informação por meio de seu comprimento, como preenchimento para uma potência de dois, mas incorre em muito menos sobrecarga de no máximo 12% para mensagens minúsculas e diminuindo gradualmente com o tamanho da mensagem .

Veja também

  • Esfolando e joeirando , misturando grandes quantidades de besteiras antes de enviar
  • Roubo de texto cifrado , outra abordagem para lidar com mensagens que não são um múltiplo do comprimento do bloco
  • Vetor de inicialização , sal (criptografia) , que às vezes é confundido com preenchimento
  • Encapsulamento de chave , uma alternativa ao preenchimento para sistemas de chave pública usados ​​para trocar chaves simétricas
  • PURB ou blob aleatório uniforme preenchido , uma disciplina de criptografia que minimiza o vazamento de metadados ou comprimento
  • A cópula russa , outra técnica para prevenir berços

Referências

Leitura adicional