Constantes MD5 - YMDA Educação
Quando pesquisamos em sites sobre criptografia que mistura dados, deparamos sempre com alguns valores do tipo 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE, etc, ligadas a um "tal" MD5 (Message-Digest algorithm 5), que, objetivamente, é uma função hash. Na verdade, esses valores são constantes que, a princípio, parecem ser coisas misteriosas e sem uma explicação didática plausível. Em alguns sites esses valores aparecem em blocos, formando uma matriz 16×4, totalizando 64 itens, dizendo que são usados na função hash. Em outros locais indicam que em Pascal pode ser utilizada a biblioteca MD5 com a instrução "Uses MD5" para fazer a criptografia. Isto seria muito simples se funcionasse em qualquer versão do Pascal; tentei no Dev-Pascal e no Pascal Zim, mas só consegui fazer funcionar no Free Pascal e, mesmo assim, a origem das constantes continuava bem misteriosa. Então, foquei na seguinte questão: "COMO SÃO OBTIDAS ESSAS CONSTANTES QUE NORTEIAM O MÉTODO MD5"? Em um deles – o mais esclarecedor que encontrei – obtive a seguinte dica: "as constantes são diretamente proporcionais ao seno(x), conde x tem o menor valor 1. E embora não mostrasse como fazer, isto foi uma dica preciosa para criar um algoritmo que implementaria a solução! Observem que os valores das constantes são SEMPRE representados em blocos de 8 bits (excluindo 0x), dando um total de 32 bits em cada linha, o que em alguns sites, são chamados de PALAVRAS. Então, desconfiei que esse 32 era a "chave" que eu precisava. Primeiramente, segui o óbvio: TUDO em Informática está baseado no sistema binário, com valores em potências de 2. Então, tentei a expressão 2^32 e encontrei 4294967296; e seguindo a dica sobre o fator seno(x), fiz C = Int(2^32*seno(x)) – com x em radianos – e considerando x=1 encontrei a primeira constante: C1=Int(2^32*Seno(1))= Int(4294967296*0.841470984) = 3614090360. Mas, como as constantes estão na base hexadecimal, tive que fazer a conversão, obtendo o valor D76AA478 para a primeira constante, confirmando o que o site informava. Então, fazendo x=2, x=3 e x=4, (para a segunda, terceira e quarta constante, respectivamente) cheguei aos primeiros quatro valores hexadecimais. Deste modo, foi fácil obter todos os 64 valores das constantes do MD5 fazendo um loop com x variando de 1 até 64, e dentro desse loop as devidas conversões. Um pouco trabalhoso, mas, relativamente fácil pois, nada que uma boa dose de Lógica e perspicácia não resolva! Seria bem interessante que esses sites mostrassem isto, sem fazer todo aquele mistério a respeito dessas constantes, apavorando os iniciantes em programação! Mas, embora o MD5 não seja o método mais seguro de criptografar mensagens, ele serve razoavelmente bem para codificar senhas.
O programa "GeraConstantesMD5", em Visualg, gera as constantes do MD5 mostradas na figura 1; a figura 2 mostra o resultado da senha encriptada pelo programa "ProgHash" em Free Pascal, e a figura 3 o código-fonte deste programa.