Criptografia Numaboa
MD4 *
Sab 24 Set 2005 19:54 |
- Detalhes
- Categoria: Funções Hash
- Atualização: Terça, 14 Abril 2009 13:53
- Autor: vovó Vicki
- Acessos: 17789
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.