sexta-feira, setembro 29, 2006
HASH
Um hash é uma seqüencia de letras ou números geradas por um algorítmo de hashing.
Essa seqüencia busca identificar um arquivo ou informação unicamente. Por exemplo, um e-mail, uma senha, uma chave ou mesmo um arquivo. Ele é um método para transformar dados de tal forma que o resultado seja (quase) exclusivo. Além disso, funções usadas em criptografia garantem que não é possível a partir de um valor de hash retornar à informação original.
Como a seqüencia do hash é limitada, muitas vezes não passando de 512 bytes, existem diversas colisões (seqüencias iguais para dados diferentes). Quanto maior for a dificuldade de se criar colisões intencionais, melhor é o algoritmo.
Uma função de hash recebe um valor de um determinado tipo e retorna um código para ele. Enquanto o ideal seria gerar identificadores únicos para os valores de entrada, isso normalmente não é possível: na maioria dos casos, o contra-domínio de nossa função é muito menor do que o seu domínio, ou seja, x (o tipo de entrada) pode assumir uma gama muito maior de valores do que hash(x) (o resultado da função de hash).
Os mais usados algoritmos de hash são os 16 bytes: MD2, MD4, MD5 ou o SHA-1, de 20 bytes. Características de alguns algoritmos:
- MD4: Desenvolvido em 1990/91 por Ron Rivest, vários ataques foram detectados, o que fez com que o algoritmo fosse considerado frágil.
- SHA-1 (Secure Hash Algorithm): Desenvolvido pelo NIST e NSA e é considerado como o mais seguro atualmente.
O processo é unidirecional e impossibilita descobrir o conteúdo original a partir do hash. O valor de conferência ("check-sum") muda se um único bit for alterado, acrescentado ou retirado da mensagem.
Criptografia de chave pública
A criptografia de chave pública ou criptografia assimétrica é um método de criptografia que utiliza um par de chaves: uma chave pública e uma chave privada. A chave pública é distribuída livremente para todos os correspondentes via e-mail ou outras formas, enquanto a chave privada deve ser conhecida apenas pelo seu dono.
Em um algoritmo de criptografia assimétrica, uma mensagem cifrada (encriptada é um termo incorrecto) com a chave pública pode somente ser decifrada pela sua chave privada correspondente. Do mesmo modo, uma mensagem cifrada com a chave privada pode somente ser decifrada pela sua chave publica correspondente.
Criptografia RSA
Para criar uma chave RSA precisamos escolher dois números primos grandes, geralmente este numeros sao maiores que 10^100, mas para facilitar vamos escolher dois números pequenos que serão associados a "p" e "q".
p = 3
q = 11
Depois vamos calcular dois novos números com base nos dois números primos escolhidos
n = p * q
z = (p - 1) * (q - 1)
Os resultados serão
n = 33
z = 20
Note que o valor "n" vai ser importante quando relacionarmos os caracteres a numeros pois os valores de cada caracter não podera eceder este valor.
Em seguida deveremos escolher um número primo em relação a "z" que será associado a "d", o único requsito é que não haja fatores comuns entre eles, por exemplo:
d = 7
O número 7 não tem fator comum com 20 por isso foi escolhido. Agora complica um pouco e seus conhecimentos em matemática serão requisitados. Voce deverá encontrar um número que será associado a "e" na seguinte formula:
(e * d) mod z = 1
Substituindo "d" e "z" pelos seus valores. Bom voce vai pensar: "Putz até dá para fazer, mas acho que esse mod vai complicar". Não se preocupe "mod" nada mais é do que o módulo do resto de uma divisão, ou seja 5 dividido por 3 vai restar 2 certo, então escrevemos assim: 5 mod 3 = 2
Entendeu? Então vamos testar, iremos escolher o número 1 para associarmos a "e":
e = 1
(1 * 7) mod 20 = 1
O valor retornado será 7 e não 1 então não pode ser 1
e = 3
(3 * 7) mod 20 = 1
O valor retornado será 1 então o nosso número será o 3
Bom já temos os valores das chaves privadas e publicas, ambas são compostas por dois valores, v1 e v2 que aplicados na seguinte fórmula genérica faz a criptografia ou descriptografia:
saída = entrada ^ v1 mod v2
Os valores "e" e "n" formam a chave pública e "d" e "n" formam a chave privada. Substituindo v1 por "e" e v2 por "n" você terá a formula de emcriptação
texto criptografado = texto original ^ e mod n
Logo o inverso será a formula para descriptografar, substituindo v1 por "d" e v2 por "n" que é a chave privada:
texto original = texto criptografado ^ d mod n
Para usar as chaves públicas e privadas é necessário associar um número a cada letra do alfabeto, por exemplo:
A = 1; B = 2; C = 3; D = 4; E = 5; F = 6; G = 7; H = 8; I = 9; J = 10; K = 11; L = 12; M = 13; N = 14;
O = 15; P = 16; Q = 17; R = 18; S = 19; T = 20; U = 21; V = 22; X = 23; Y = 24; W = 25; Z = 26
Com exemplo vamos encriptar de desencriptar a letra "m", para isso veremos qual o número correspondente na tabela acima e verificamos que é o número 13, então:
texto criptografado = 13 ^ e mod n
texto criptografado = 13 ^ 3 mod 33
texto criptografado = 19
Convertendo o valor para a tabela padronizada anteriormente teremos a letra "S". O destinatário ao receber a mensagem deverá descriptografá-la usando a fórmula usando os dados da chave privada:
texto original = 19 ^ d mod n
texto original = 19 ^ 7 mod 33
texto original = 13
O número 13 é equivalente a letra "M" na tabela padronizada anteriormente.