[22] Comentário enviado por
elgio em 27/02/2009 - 16:18h:
Oi stremer!
Obrigado pelos elogios. Eu realmente pretendo continuar esta série de artigos.
Quanto a sua pergunta, dependendo do algoritmo e do tamanho da chave, nenhum exército de máquinas conseguirá quebrar (por força BRUTA!). Nem todas as máquinas do mundo.
Se usares o AES com 128 bits de chave, por exemplo, os números são realmente IMPLACÁVEIS!
Mesmo tentando 1/4 das possíveis chaves, o que nos daria 2^126 combinações e fazendo o seguinte exercício:
- Existe um código que consegue tentar uma chave por ciclo de CPU: IMPOSSÏVEL. Mesmo os códigos mais otimizados usarão milhares de ciclos de CPU. Mas que seja.
- Com este hipotético código, um processador de 1Ghz consegue tentar 1.000.000.000 de chaves por segundo (1 bilhão) pois ele tenta uma a cada ciclo.
- Digamos que tenho processadores de 10Ghz (outra bobabem) e que existe uma máquina, uma única, como 1.000.000 (1 milhão) de processadores.
Resumindo: 1 máquina, com 1 milhão de processadores, cada um de 10Ghz tentando uma chave por ciclo de CPU.
Segundo a wikipedia, a população mundial hoje chega perto dos 6 Bilhões de pessoas. Vamos supor que cada uma destas pessoas tenha uma destas maquinas e está disposta a nos ajudar:
- 6 Bilhões de máquinas tentando (6.000.000.000)
- Cada máquina com 1 milhão de processadores (1.000.000)
- Cada processador de 10Gh (10.000.000.000)
- e um teste por ciclo de CPU, precisando testar 1/4 das chaves (2^126)
Vamos lá:
echo "2^126 / 10000000000 / 1000000 / 6000000000 / 60 / 60 / 24 / 365"|bc
2^126 numero de chaves
divido por 10.000.000.000 porque cada chipe testa isto por segundo
divido depois por 1.000.000 porque uma única máquina tem 1 milhão de chips
divido por 6.000.000.000 porque cada cidadão do planeta tem uma máquina destas
Ai eu teria o número de segundos que meu teste levaria: 1.417.843.195.503
Divido por 60 para ter em minutos, por 60 novamente para ter horas, por 24 para ter dias e por 365 para ter anos.
Ainda sim eu levaria 44.959 anos!
Não tem como querer dizer que possa ser quebrado por força bruta! NÃO MESMO! O algoritmo é muito forte. E veja que um milésimo disto ainda seria 44 anos.
Pode-se discutir que agências como a NSA tenham descoberto furos e tem atalhos para quebrar. Pode-se discutir sobre terem já as tais máquinas quanticas. Mas a matemática da força bruta é esta. Pura e simples.
Agora claro que qualquer um pode boicotar até mesmo o melhor algoritmo. Foi o que o padrão WEP fez, implementou o RC4 de forma equívoca e até hoje tem gente que pensa que o RC4 é ruim.
Exemplo de uma má utilização do AES:
Como a chave é de até 128 bits, eu determino que o tamanho da chave será de 16 caracteres e uso estes caracteres DIRETO como chave. Se o usuário não digitar os 16 eu preencho com zero!
Ai dançou!
Pois cada byte da chave poderá ser apenas letras e numeros sendo que é bem provável que alguns bytes sejam ZERO porque o usuário não usou 16 letras. Se ele usar apenas 8 letras e, PIOR, usar apenas números, um teste de 00000000 até 99999999 terá resultado!
O que se faz neste caso, como o gnupg, por exemplo.
Se usa a senha que o usuário digitou, que se chama de frase de passagem, se gera um hash dela e usa o hash como chave.
Exemplo: vou cifrar meu HD com AES. O programa pede uma frase de passagem (sem limite de letras).
Eu digito:
"Ape,Nas989 para nao esquecer$#"
O programa computa md5(frase):
echo -ne "Ape,Nas989 para nao esquecer$#"|md5sum
Que em hexa da bfb7a0cb7bb67ed6c5a2d0bf253a499b
Se usa isto como chave!
Quando o usuário digitar a frase de passagem, se repete o processo!
É uma solução super eficiente para não limitar as possíveis chaves.