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) 


Passo 4: Processamento da mensagem em blocos de 16 words

Inicialmente são definidas três funções auxiliares. Estas funções usam como entrada três words (3 x 32 = 96 bits) para produzirem uma saída de um word (32 bits). São elas

     F(X,Y,Z) = (X and Y) or ((not X) and Z)
     G(X,Y,Z) = (X and Y) or (X and Z) or (Y and Z)
     H(X,Y,Z) = X xor Y xor Z

Em cada um dos bits, a função F atua condicionalmente, ou seja, se X então Y, senão Z. G atua como uma função de maioria: se pelo menos dois bits de X, Y e Z estiverem ligados, G produz um bit "1" nesta posição, senão o bit será "0". A função H é um XOR bit a bit ou função de paridade.

Antes de aplicar estas funções, os valores de A, B, C e D precisam ser preservados pois serão usados no final do cálculo. As variáveis de trabalho, baseadas nestes valores e usadas neste texto serão a = A, b = B, c = C e d = D

A seguir, as funções são aplicadas considerando-se que:

     Tendo [abcd k s i] a operação será a = ((a + F(b,c,d) + X[k] + T[i]) <<< s) + b
     T[i] é uma constante
     X[k] é o sub-bloco de texto
     <<< s é rotação dos bits para a esquerda

Aplica-se inicialmente a função F para completar a primeira rodada, onde a constante T[i] = 0:

     /* Rodada 1
     [abcd  0  3]   a = ((a + ((b and c) or ((not b) and d)) + X[0])  <<<  3)
     [dabc  1  7]   d = ((d + ((a and b) or ((not a) and c)) + X[1])  <<<  7)
     [cdab  2 11]   c = ((c + ((d and a) or ((not d) and b)) + X[2])  <<< 11)
     [bcda  3 19]   b = ((b + ((c and d) or ((not c) and a)) + X[3])  <<< 19)
     [abcd  4  3]   a = ((a + ((b and c) or ((not b) and d)) + X[4])  <<<  3)
     [dabc  5  7]   d = ((d + ((a and b) or ((not a) and c)) + X[5])  <<<  7)
     [cdab  6 11]   c = ((c + ((d and a) or ((not d) and b)) + X[6])  <<< 11)
     [bcda  7 19]   b = ((b + ((c and d) or ((not c) and a)) + X[7])  <<< 19)
     [abcd  8  3]   a = ((a + ((b and c) or ((not b) and d)) + X[8])  <<<  3)
     [dabc  9  7]   d = ((d + ((a and b) or ((not a) and c)) + X[9])  <<<  7)
     [cdab 10 11]   c = ((c + ((d and a) or ((not d) and b)) + X[10]) <<< 11)
     [bcda 11 19]   b = ((b + ((c and d) or ((not c) and a)) + X[11]) <<< 19)
     [abcd 12  3]   a = ((a + ((b and c) or ((not b) and d)) + X[12]) <<<  3)
     [dabc 13  7]   d = ((d + ((a and b) or ((not a) and c)) + X[13]) <<<  7)
     [cdab 14 11]   c = ((c + ((d and a) or ((not d) and b)) + X[14]) <<< 11)
     [bcda 15 19]   b = ((b + ((c and d) or ((not c) and a)) + X[15]) <<< 19)

A função G é usada na segunda rodada, onde a constante T[i] tem o valor hexadecimal 5A82 7999 (é o valor da raiz quadrada de 2):

     /* Rodada 2
     [abcd  0  3]   a = ((a + ((b and c) or (b and d) or (c and d)) + X[0]  + 5A827999) <<<  3)
     [dabc  4  5]   d = ((d + ((a and b) or (a and c) or (b and c)) + X[4]  + 5A827999) <<<  5)
     [cdab  8  9]   c = ((c + ((d and a) or (d and b) or (a and b)) + X[8]  + 5A827999) <<<  9)
     [bcda 12 13]   b = ((b + ((c and d) or (c and a) or (d and a)) + X[12] + 5A827999) <<< 13)
     [abcd  1  3]   a = ((a + ((b and c) or (b and d) or (c and d)) + X[1]  + 5A827999) <<<  3)
     [dabc  5  5]   d = ((d + ((a and b) or (a and c) or (b and c)) + X[5]  + 5A827999) <<<  5)
     [cdab  9  9]   c = ((c + ((d and a) or (d and b) or (a and b)) + X[9]  + 5A827999) <<<  9)
     [bcda 13 13]   b = ((b + ((c and d) or (c and a) or (d and a)) + X[13] + 5A827999) <<< 13)
     [abcd  2  3]   a = ((a + ((b and c) or (b and d) or (c and d)) + X[2]  + 5A827999) <<<  3)
     [dabc  6  5]   d = ((d + ((a and b) or (a and c) or (b and c)) + X[6]  + 5A827999) <<<  5)
     [cdab 10  9]   c = ((c + ((d and a) or (d and b) or (a and b)) + X[10] + 5A827999) <<<  9)
     [bcda 14 13]   b = ((b + ((c and d) or (c and a) or (d and a)) + X[14] + 5A827999) <<< 13)
     [abcd  3  3]   a = ((a + ((b and c) or (b and d) or (c and d)) + X[3]  + 5A827999) <<<  3)
     [dabc  7  5]   d = ((d + ((a and b) or (a and c) or (b and c)) + X[7]  + 5A827999) <<<  5)
     [cdab 11  9]   c = ((c + ((d and a) or (d and b) or (a and b)) + X[11] + 5A827999) <<<  9)
     [bcda 15 13]   b = ((b + ((c and d) or (c and a) or (d and a)) + X[15] + 5A827999) <<< 13)

Na terceira rodada é aplicada a função H com a constante T[i] tem o valor hexadecimal 6ED9 EBA1 (é o valor da raiz quadrada de 3):

     /* Rodada 3
     [abcd  0  3]   a = ((a + (b xor c xor d) + X[0]  + 6ED9EBA1) <<<  3)
     [dabc  8  9]   d = ((d + (a xor b xor c) + X[8]  + 6ED9EBA1) <<<  9)
     [cdab  4 11]   c = ((c + (d xor a xor b) + X[4]  + 6ED9EBA1) <<< 11)
     [bcda 12 15]   b = ((b + (c xor d xor a) + X[12] + 6ED9EBA1) <<< 15)

     [abcd  2  3]   a = ((a + (b xor c xor d) + X[2]  + 6ED9EBA1) <<<  3)
     [dabc 10  9]   d = ((d + (a xor b xor c) + X[10] + 6ED9EBA1) <<<  9)
     [cdab  5 11]   c = ((c + (d xor a xor b) + X[9]  + 6ED9EBA1) <<< 11)
     [bcda 13 15]   b = ((b + (c xor d xor a) + X[13] + 6ED9EBA1) <<< 13)
     [abcd  1  3]   a = ((a + (b xor c xor d) + X[1]  + 6ED9EBA1) <<<  3)
     [dabc  9  9]   d = ((d + (a xor b xor c) + X[9]  + 6ED9EBA1) <<<  9)
     [cdab  5 11]   c = ((c + (d xor a xor b) + X[5]  + 6ED9EBA1) <<< 11)
     [bcda 13 15]   b = ((b + (c xor d xor a) + X[13] + 6ED9EBA1) <<< 15)
     [abcd  3  3]   a = ((a + (b xor c xor d) + X[3]  + 6ED9EBA1) <<<  3)
     [dabc 11  9]   d = ((d + (a xor b xor c) + X[11] + 6ED9EBA1) <<<  9)
     [cdab  7 11]   c = ((c + (d xor a xor b) + X[7]  + 6ED9EBA1) <<< 11)
     [bcda 15 15]   b = ((b + (c xor d xor a) + X[15] + 6ED9EBA1) <<< 15)

Finalmente, os resultados obtidos para a, b, c, d são somados aos valores originais A, B, C e D:

     A = a + A
     B = b + B
     C = c + C
     D = d + D
Passo 5: Obtenção do valor hash

O digesto da mensagem é produzido concatenando-se A, B, C e D, começando com o byte menos significativo de A e terminando com o mais significativo de D.

Informações adicionais