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: 18552
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


