A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Criptografia Numaboa

MD4 *

Sab

24

Set

2005


19:54

(6 votos, média 5.00 de 5) 


A dança dos bits

Para visualizar o que acontece no nível dos bits, vamos tomar como exemplo o texto "abc". Os valores dos caracteres que compõem esta mensagem são:

         Decimal  Hexa     Binário
         -------  ----    ---------
     a     97      61     0110 0001
     b     98      62     0110 0010
     c     99      63     0110 0011

O texto fornece apenas um bloco de 512 bits, dividido em 16 sub-blocos de 32 bits. Logo depois dos bits da mensagem está o bit marcador "1" que, dentro do byte, assume a forma 1000 0000. Os bytes são colocados no registrador de "trás para frente", ou seja:

               1    0    6    3    6    2    6    1     (valor hexadecimal)
             ---- ---- ---- ---- ---- ---- ---- ----
     X[0]  = 1000 0000 0110 0011 0110 0010 0110 0001
     X[1]  = 0000 0000 0000 0000 0000 0000 0000 0000
     ...
     X[15] = 0000 0000 0000 0000 0000 0000 0001 1000 = 24 (comprimento da mensagem em bits)
A dança dos bits - A primeira rodada (função F)

A primeira etapa da primeira rodada utiliza a função F(b,c,d), soma o resultado com a e com o texto, para finalmente fazer uma rotação de três posições da esquerda para a direita para obter o novo valor de a.

     
            b = 1110 1111 1100 1101 1010 1011 1000 1001
        AND c = 1001 1000 1011 1010 1101 1100 1111 1110
                ---------------------------------------
                1000 1000 1000 1000 1000 1000 1000 1000 (1)

        NOT b = 0001 0000 0011 0010 0101 0100 0111 0110
        AND d = 0001 0000 0011 0010 0101 0100 0111 0110
                ---------------------------------------
                0001 0000 0011 0010 0101 0100 0111 0110 (2)

          (1) = 1000 1000 1000 1000 1000 1000 1000 1000
       OR (2) = 0001 0000 0011 0010 0101 0100 0111 0110
                ---------------------------------------
     F(b,c,d) = 1001 1000 1011 1010 1101 1100 1111 1110
          + a   0110 0111 0100 0101 0010 0011 0000 0001
                ---------------------------------------
                1111 1111 1111 1111 1111 1111 1111 1111
  + texto X[0]  1000 0000 0110 0011 0110 0010 0110 0001
                ---------------------------------------
                1000 0000 0110 0011 0110 0010 0110 0000
        <<< 3 = 0000 0011 0001 1011 0001 0011 0000 0100 = a

A segunda etapa da primeira rodada repete o procedimento anterior aplicando a função F(a,b,c).

     
            a = 0000 0011 0001 1011 0001 0011 0000 0100
        AND b = 1110 1111 1100 1101 1010 1011 1000 1001
                ---------------------------------------
                0000 0011 0000 1001 0000 0011 0000 0000 (1)
               
        NOT a = 1111 1100 1110 0100 1110 1100 1111 1011
        AND c = 1001 1000 1011 1010 1101 1100 1111 1110
                ---------------------------------------
                1001 1000 1010 0000 1100 1100 1111 1010 (2)
                 
          (1) = 0000 0011 0000 1001 0000 0011 0000 0000
       OR (2) = 1001 1000 1010 0000 1100 1100 1111 1010
                ---------------------------------------
     F(a,b,c) = 1001 1011 1010 1001 1100 1111 1111 1010
          + d   0001 0000 0011 0010 0101 0100 0111 0110
                ---------------------------------------
                1010 1011 1101 1100 0010 0100 0111 0000
  + texto X[1]  0000 0000 0000 0000 0000 0000 0000 0000
                ---------------------------------------
                1010 1011 1101 1100 0010 0100 0111 0000
        <<< 7 = 1110 1110 0001 0010 0011 1000 0101 0101 = d

Depois das 16 etapas da primeira rodada, os valores encontrados são:

     a = 1010 0010 1001 1001 1010 0101 0100 0000
     b = 1101 1010 0111 0001 0111 0011 1001 0101
     c = 0010 0100 1011 1010 1010 1101 1100 1011
     d = 0000 0100 1110 0001 1001 0010 1001 0011
A dança dos bits - A segunda rodada (função G)

A segunda rodada usa os valores encontrados e aplica a função G:

           b = 1101 1010 0111 0001 0111 0011 1001 0101
       AND c = 0010 0100 1011 1010 1010 1101 1100 1011
               ---------------------------------------
               0000 0000 0011 0000 0010 0001 1000 0001 (1)

           b = 1101 1010 0111 0001 0111 0011 1001 0101
       AND d = 0000 0100 1110 0001 1001 0010 1001 0011
               ---------------------------------------
               0000 0000 0110 0001 0001 0010 1001 0001 (2)

           c = 0010 0100 1011 1010 1010 1101 1100 1011
       AND d = 0000 0100 1110 0001 1001 0010 1001 0011
               ---------------------------------------
               0000 0100 1010 0000 1000 0000 1000 0011 (3)

         (1) = 0000 0000 0011 0000 0010 0001 1000 0001
      OR (2) = 0000 0000 0110 0001 0001 0010 1001 0001
               ---------------------------------------
               0000 0000 0111 0001 0011 0011 1001 0001
      OR (3) = 0000 0100 1010 0000 1000 0000 1000 0011
               ---------------------------------------
    G(b,c,d) = 0000 0100 1111 0001 1011 0011 1001 0011
         + a   1010 0010 1001 1001 1010 0101 0100 0000
               ---------------------------------------
               1010 0111 1000 1011 0101 1000 1101 0011
  texto X[0] = 1000 0000 0110 0011 0110 0010 0110 0001
               ---------------------------------------
               0010 0111 1110 1110 1011 1011 0011 0100
     + const   0101 1010 1000 0010 0111 1001 1001 1001  (hexadecimal 5A827999)
               ---------------------------------------
               1000 0010 0111 0001 0011 0100 1100 1101
       <<< 3   0001 0011 1000 1001 1010 0110 0110 1100 = a

Seguindo o mesmo esquema, completa-se as 16 rodadas da segunda etapa com o auxílio da função G para se obter os novos valores:

     a = 0111 0010 1001 0110 0101 1001 0100 1100
     b = 1000 1110 0101 0011 0001 1011 1000 1111
     c = 0011 1101 1101 0100 0010 0100 0010 0010
     d = 0100 1110 0111 1110 0001 0111 0100 1000
A dança dos bits - A terceira rodada (função H)

A terceira rodada usa os valores encontrados e aplica a função H:

           b = 1000 1110 0101 0011 0001 1011 1000 1111
       XOR c = 0011 1101 1101 0100 0010 0100 0010 0010
               ---------------------------------------
               1011 0011 1000 0111 0011 1111 1010 1101
       XOR d = 0100 1110 0111 1110 0001 0111 0100 1000
               ---------------------------------------
    H(b,c,d) = 1111 1101 1111 1001 0010 1000 1110 0101
         + a   0111 0010 1001 0110 0101 1001 0100 1100
               ---------------------------------------
               0111 0000 1000 1111 1000 0010 0011 0001
  texto X[0] = 1000 0000 0110 0011 0110 0010 0110 0001
               ---------------------------------------
               1111 0000 1111 0010 1110 0100 1001 0010
     + const   0110 1110 1101 1001 1110 1011 1010 0001  (hexadecimal 6ED9EBA1)
               ---------------------------------------
               0101 1111 1100 1100 1101 0000 0011 0011
       <<< 3   1111 1110 0110 0110 1000 0001 1001 1010 = a

No final das 16 etapas da terceira rodada os valores são:

     a = 0001 0010 1011 1100 0010 0101 1010 0011
     b = 0110 0011 0000 1010 0111 0110 0010 0110
     c = 0100 1111 0100 1111 1110 0100 0110 0001
     d = 1000 1101 0100 0000 0101 0010 0000 0100
A dança dos bits - O cálculo final para obter o hash

Somando os valores obtidos aos valores iniciais correspondentes e concatenando os resultados obtém-se o hash:

     a = 0001 0010 1011 1100 0010 0101 1010 0011
   + A = 0110 0111 0100 0101 0010 0011 0000 0001
         ---------------------------------------
         0111 1010 0000 0001 0100 1000 1010 0100
         ---- ---- ---- ---- ---- ---- ---- ----
        |  7    A |  0    1 |  4    8 |  A    4 |  = A448 017A


     b = 0110 0011 0000 1010 0111 0110 0010 0110
   + B = 1110 1111 1100 1101 1010 1011 1000 1001
         ---------------------------------------
         0101 0010 1101 1000 0010 0001 1010 1111
         ---- ---- ---- ---- ---- ---- ---- ----
        |  5    2 |  D    8 |  2    1 |  A    F |  = AF21 D852


     c = 0100 1111 0100 1111 1110 0100 0110 0001
   + C = 1001 1000 1011 1010 1101 1100 1111 1110
         ---------------------------------------
         1110 1000 0000 1010 1100 0001 0101 1111
         ---- ---- ---- ---- ---- ---- ---- ----
        |  E    8 |  0    A |  C    1 |  5    F |  = 5FC1 0AE8


     d = 1000 1101 0100 0000 0101 0010 0000 0100
   + D = 0001 0000 0011 0010 0101 0100 0111 0110
         ---------------------------------------
         1001 1101 0111 0010 1010 0110 0111 1010
         ---- ---- ---- ---- ---- ---- ---- ----
        |  9    D |  7    2 |  A    6 |  7    A |  = 7AA6 729D
O hash MD4 do texto "abc" é: A448017AAF21D8525FC10AE87AA6729D

Informações adicionais