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.
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.
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.
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.
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.
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