Escolar Documentos
Profissional Documentos
Cultura Documentos
consiste basicamente em um algoritmo de dispersão, no qual há uma função hash (H), que p
ossui um valor de entrada (x) no qual H(x) retorna um valor (código).
A principal caraterística que garante a segurança dessa criptografia é que partindo do
código, H(x), não se encontra o valor original x facilmente.
tipos
MD4: 128bits, aposentado em 2004 após ser quebrado facilmente por pesquisadores ch
ineses
A função hash de mão única MD4 foi projetada por Ron Rivest e publicada oficialmente pel
a primeira vez em outubro de 1990. O algoritmo usa como entrada uma mensagem d
e comprimento arbitrário e produz uma "impressão digital" ou um "digesto de mensagem
" de 128 bits. MD vem de message digest, cuja tradução pode parecer estranha, mas é di
gesto de mensagem. Um digesto é uma compilação de diretrizes ou uma coleção de decisões, ge
almente aplicado como termo jurídico sorriso
O MD4 foi criado para ser utilizado em assinaturas digitais onde um texto longo
precisa ser "comprimido" de forma segura antes de ser cifrado com uma chave priv
ada (secreta) por um criptossistema de chave pública. Foi projetado para ser basta
nte rápido em máquinas de 32 bits. Além disso, não necessita de grandes tabelas de subst
ituição e pode ser facilmente programado de forma compacta. O autor colocou o algori
tmo no domínio público.
Descrição do algoritmo MD4
A entrada do MD4 é uma mensagem que pode ter qualquer comprimento, ou seja, qualqu
er mensagem com um número arbitrário de bits. O número de bits, representado por b, é um
número inteiro positivo que varia de zero até o infinito. Para obter o digesto da m
ensagem, seus bits, representados por m0, m1, ..., m{b-1}, onde b = número de bits
da mensagem, são submetidos a diversas operações. Este processo é dividido em cinco eta
pas ou passos.
Passo 1: Adição de bits
A mensagem é "esticada" com a adição de bits até que atinja um comprimento congruente co
m 448 no módulo 512, ou seja, adiciona-se tantos bits quantos forem necessários para
que o comprimento da mensagem seja 448 ou qualquer múltiplo de 512 menos 64 bits
(512 - 64 = 448, 1024 - 64 = 960, etc). Esta adição pressupõe a inclusão de no mínimo um b
it e, no máximo, de 512 bits.
O primeiro bit que deve ser adicionado logo no final da mensagem original é um bit
"1". Todos os outros, necessários para se atingir o comprimento preconizado, são bi
ts "0".
Passo 2: Incluir comprimento
O valor b, que representa o comprimento em bits da mensagem original, deve ser a
dicionado à mensagem previamente preparada no passo 1 na forma de 64 bits. É pouco p
rovável que o valor de b seja maior do que 264, porém, caso isto ocorra, apenas os 6
4 bits menos significativos de b serão usados. Estes 64 bits são adicionados como do
is words de 32 bits. O word menos significativo é inserido primeiro, seguido do wo
rd mais significativo.
Neste ponto, o comprimento da mensagem resultante é 512 ou um dos seus múltiplos. Ta
mbém é um múltiplo exato de 16 words pois, se um word possui 32 bits, 16 words possuem
16 x 32 = 512 bits. Estes words podem ser representados por M[0, 1, ..., N-1],
onde N é um múltiplo de 16.
Passo 3: Inicialização do buffer MD
Um buffer de quatro words é usado para calcular o digesto da mensagem. Os registra
dores de 32 bits A, B, C e D são inicializados com os seguintes valores hexadecima
is:
word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10
Nestes valores, os bytes mais significativos são colocados após os menos significati
vos, ou seja
Hexadecimal Binário Decimal
----------- --------------------------------------- -------------
A: 67 45 23 01 0110 0111 0100 0101 0010 0011 0000 0001 1.732.584.193
B: ef cd ab 89 1110 1111 1100 1101 1010 1011 1000 1001 4.023.233.417
C: 98 ba dc fe 1001 1000 1011 1010 1101 1100 1111 1110 2.562.383.102
D: 10 32 54 76 0001 0000 0011 0010 0101 0100 0111 0110 271.733.878
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 wo
(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 liga
dos, G produz um bit "1" nesta posição, senão o bit será "0". A função H é um XOR bit a bit
função de paridade.
Antes de aplicar estas funções, os valores de A, B, C e D precisam ser preservados p
ois serão usados no final do cálculo. As variáveis de trabalho, baseadas nestes valore
s 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 5A
82 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] + 5A
827999) <<< 3)
[dabc 4 5] d = ((d + ((a and b) or (a and c) or (b and c)) + X[4] + 5A
827999) <<< 5)
[cdab 8 9] c = ((c + ((d and a) or (d and b) or (a and b)) + X[8] + 5A
827999) <<< 9)
[bcda 12 13] b = ((b + ((c and d) or (c and a) or (d and a)) + X[12] + 5A
827999) <<< 13)
[abcd 1 3] a = ((a + ((b and c) or (b and d) or (c and d)) + X[1] + 5A
827999) <<< 3)
[dabc 5 5] d = ((d + ((a and b) or (a and c) or (b and c)) + X[5] + 5A
827999) <<< 5)
[cdab 9 9] c = ((c + ((d and a) or (d and b) or (a and b)) + X[9] + 5A
827999) <<< 9)
[bcda 13 13] b = ((b + ((c and d) or (c and a) or (d and a)) + X[13] + 5A
827999) <<< 13)
[abcd 2 3] a = ((a + ((b and c) or (b and d) or (c and d)) + X[2] + 5A
827999) <<< 3)
[dabc 6 5] d = ((d + ((a and b) or (a and c) or (b and c)) + X[6] + 5A
827999) <<< 5)
[cdab 10 9] c = ((c + ((d and a) or (d and b) or (a and b)) + X[10] + 5A
827999) <<< 9)
[bcda 14 13] b = ((b + ((c and d) or (c and a) or (d and a)) + X[14] + 5A
827999) <<< 13)
[abcd 3 3] a = ((a + ((b and c) or (b and d) or (c and d)) + X[3] + 5A
827999) <<< 3)
[dabc 7 5] d = ((d + ((a and b) or (a and c) or (b and c)) + X[7] + 5A
827999) <<< 5)
[cdab 11 9] c = ((c + ((d and a) or (d and b) or (a and b)) + X[11] + 5A
827999) <<< 9)
[bcda 15 13] b = ((b + ((c and d) or (c and a) or (d and a)) + X[15] + 5A
827999) <<< 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 originai
s 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.
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 bit
s. Logo depois dos bits da mensagem está o bit marcador "1" que, dentro do byte, a
ssume 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 mensag
em 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 dir
eita para obter o novo valor de a.
MD5
128 bits unidirecional, utilizado muito em protocolos ponto-a-ponto (P2P) em ver
ificação de integridade de arquivos e logins, RFC1352, RFC1446, etc.
sucedeu o MD4 que apresentava alguns problemas de segurança. Por ser unidirecional
, não é possível ser decodificado na mensagem original, portanto, é feita comparação entre
hash da mensagem original e a hash da mensagem recebida)
The MD5 algorithm uses 4 state variables, each of which is a 32 bit integer (an
unsigned long on most systems). These variables are sliced and diced and are (ev
entually) the message digest. The variables are initialized as follows:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
Now on to the actual meat of the algorithm: the main part of the algorithm uses
four functions to thoroughly goober the above state variables. Those functions a
re as follows:
F(X,Y,Z) = (X & Y) | (~(X) & Z)
G(X,Y,Z) = (X & Z) | (Y & ~(Z))
H(X,Y,Z) = X ^ Y ^ Z
I(X,Y,Z) = Y ^ (X | ~(Z))
Where &, |, ^, and ~ are the bit-wise AND, OR, XOR, and NOT operators (respectiv
ely) that all C programmers should be familiar with.
These functions, using the state variables and the message as input, are used to
transform the state variables from their initial state into what will become th
e message digest. For each 512 bits of the message, the following is performed (
this is only pseudo-code, don t try to compile it):
/* Group the 512 bit message into 16 different 32 bit chunks */
For j = 0 to 15 do
Set X[j] to MessageBits[j*32] through MessageBits[j*32 + 31]
end
/* Store the digest variables out of harms way for the time being */
AA = A
BB = B
CC = C
DD = D
/* Round 1. */
/* Let [abcd k s i] denote the operation:
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
/* Round 2. */
/* Let [abcd k s i] denote the operation:
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
/* Round 3. */
/* Let [abcd k s t] denote the operation
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
/* Round 4. */
/* Let [abcd k s t] denote the operation
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
/* And finally update the state variables */
A+=AA
B+=BB
C+=CC
D+=DD
(If you are confused on what <<< does, let it be known that it represents a bit-wi
se rotation to the left, e.g. 110011 <<< 2 = 001111)
After this step, the message digest is stored in the state variables (A, B, C, a
nd D). To get it into the hexadecimal form you are used to seeing, output the he
x values of each the state variables, least significant byte first. For example,
if after the digest:
A = 0x01234567;
B = 0x89ABCDEF;
C = 0x1337D00D
D = 0xA5510101
fontes:
http://tools.ietf.org/html/rfc1321
SHA-1