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