O algoritmo MD5 é útil apenas para bytes, em vez de bits?
O algoritmo MD5 é projetado para aceitar uma mensagem de qualquer comprimento e produzir um resumo da mensagem de 512 bits. Devido à maneira como ele preenche a mensagem original, adicionando um bit de 1 e um número de bits de 0, o comprimento da mensagem pode ser qualquer número de bits. Não está limitado a um número inteiro de bytes. Mas também pode ser escrito para funcionar apenas em bytes, portanto, o estágio de preenchimento envolveria a adição de um byte 0x80 e depois um número de bytes 0x00. O resultado final é o mesmo, desde que os dados de entrada sejam um número inteiro de bytes.
No entanto, meu entendimento é que os dados quase sempre são armazenados em bytes. Este é especialmente o caso de cadeias de caracteres, onde cada caractere é representado por pelo menos 1 byte. Para este caso de uso, acredito que uma abordagem orientada a bytes funcionaria bem. Mas se eu quisesse escrever uma implementação MD5 que também aceite arquivos, a distinção bit / byte se torna importante? Eu precisaria escrever o algoritmo para lidar especificamente com bits ou uma implementação orientada a bytes funcionaria tão bem para strings (por exemplo, de STDIN) e arquivos?
Em outras palavras, os dados são sempre armazenados como bytes inteiros? E em caso afirmativo, quais aplicativos existem nos quais seria necessário escrever um algoritmo MD5 que usa bits individuais, em vez de bytes inteiros?
Respostas
Se eu quisesse escrever uma implementação MD5 que também aceita arquivos, a distinção bit / byte se torna importante?
Não , uma implementação de byte está bem. Em sistemas operacionais modernos, o hash de um arquivo, pipe, string (qualquer que seja a codificação) é o hash de bytes.
As únicas vezes que fiz e usei uma implementação de hash com suporte a bits foi para fazer ou verificar vetores de teste. Mas posso imaginar alguns casos de uso que exigiriam pouco suporte
- hashing da expressão como um número mínimo de bits de um inteiro (por algum endianness especificado), para um algoritmo hipotético especificando isso.
- deseja-se algumas variantes do MD5 e as obtém anexando um sufixo menor que um byte a uma cadeia de bytes alimentada ao MD5. Para mensagens de 15 bytes que faz uma economia computacional em comparação com o acréscimo de um byte inteiro (um bloco de mensagem interno preenchido de 32 bytes em vez de dois), além de evitar colisões triviais com MD5 regular.