PADDING

Padding é o nome dado a qualquer tipo de algoritmo que “ajusta” o comprimento de uma mensagem. Idealmente, esse algoritmo é reversível (i.e. o receptor não enfrenta ambiguidade em relação a onde começa ou termina o padding) e não afeta a segurança criptográfica do canal (i.e. não introduz padrões estatísticos indesejáveis no texto ilegível).

O principal uso do padding é a adequação de mensagens de comprimento pequeno a algoritmos de criptografia com entrada de tamanho fixo. Unido de um modo de operação, essas técnicas nos permitem criptografar mensagens de tamanho arbitrário.

História

Na criptografia clássica, frases aleatórias eram introduzidas como padding para dificultar que um “texto legível conhecido” fosse encontrado, uma vez que é muito comum que mensagens comecem ou terminem de forma previsível (“Caro {nome}, ….”, “Atenciosamente”, “Sincerely yours”, etc).

Um caso famoso de mal uso de um padding na criptografia clássica data da segunda guerra mundial, na Batalha de Samar, quando o Almirante Bull Halsey da frota pacífica americana recebeu a mensagem

“Where is, repeat, where is Task Force Thirty Four?”

que, com metadados e padding adicionado, foi enviada como

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

onde o texto em negrito corresponde ao padding. O fim da mensagem foi interpretado erroneamente como um comentário sarcástico: “Onde está a força tarefa trinta e quatro? O mundo se pergunta…”, o que levou o almirante a uma crise emocional que quase o impediu de mover sua frota para auxiliar na batalha. Caso o almirante tivesse decidido não mover sua frota, a batalha provavelmente teria sido perdida.

Padding de bits

O padding binário consiste em simplesmente adicionar um bit 1 seguido de quantos 0s forem necessários para ajustar o tamanho da string. Por exemplo, adequando uma mensagem a 16 bits:

0100 0010 011 -> 0100 0010 0111 0000

O único caso em que esse padding se torna não reversível é quando o último dígito da mensagem é 1, de maneira que não se pode saber se esse dígito é padding ou parte da mensagem original. Isso não é um problema quando se sabe previamente se o texto terá ou não padding.

ANSI X9.23

No padding descrito pelo padrão ANSI X9.23, o padding é realizado com bytes aleatórios, exceto pelo último byte, que equivale ao número total de bytes de padding adicionados.

Por exemplo, adequando uma mensagem a 8 bytes:

5F E2 11 -> 5F E2 11 9F 31 0A A6 05

onde os bytes 9F 31 0A A6 são obtidos de forma aleatória e o byte final 05 indica que 5 bytes de padding foram adicionados (incluindo o último).

Em uma variação deste padrão, os bytes aleatórios são substituidos por bytes nulos. Nesse caso, introduzimos bastante redundância na mensagem, mas a implementação se torna mais fácil:

5F E2 11 -> 5F E2 11 00 00 00 00 05

Esse padrão pode ser usado quando tanto o texto quanto o bloco final tem comprimento múltiplo de 8 (i.e. devem estar em bytes) e quando o padding necessário é menor ou igual a 256 bytes.

Este padrão se torna ambíguo quando o último byte da mensagem é 01. Neste caso, é impossível saber se a mensagem original termina em 01 ou se um único byte de padding foi adicionado. Isso não é um problema quando se sabe previamente se o texto terá ou não padding.

PKCS#7

No padding descrito pelo padrão PKCS#7, o padding é realizado com o byte equivalente ao número de bytes de padding a serem adicionados.

Por exemplo, adequando uma mensagem a 8 bytes:

5F E2 11 -> 5F E2 11 05 05 05 05 05

Onde utilizamos o byte 05 para o padding pois 5 bytes de padding foram adicionados.

Esse padrão também se torna ambíguo quando o último byte da mensagem enviada é 01. Neste caso, é impossível saber se a mensagem original termina em 01 ou se um único byte de padding foi adicionado. Isso não é um problema quando se sabe previamente se o texto terá ou não padding.

O número 7 no nome do padrão apenas indica que o número de bytes de padding é no máximo 256. O padrão PKCS#5 é idêntico, exceto que só está definido para blocos de 8 bytes (64 bits). Os dois podem ser utilizados de forma intercambiável.

Zero padding

No zero padding, ou null padding, todos os bits/bytes de padding são 0s. Esse padding pode não ser reversível se a mensagem original termina em um ou mais 0s e, portanto, deve ser evitado.

Por exemplo, adequando uma mensagem a 8 bytes:

5F E2 11 -> 5F E2 11 00 00 00 00 00

Ou, adequando uma mensagem a 16 bits:

0100 0010 011 -> 0100 0010 0110 0000
© 2025 Luã Jaz. Todos os direitos reservados.