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: 18570
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.


