Criptografia Assimétrica

Até agora, a criptografia que vimos foi simétrica: A mesma chave usada para codificar, serve para decodificar. A criptografia Assimétrica é aquela em que a chave usada para codificar é diferente da usada para decodificar.

Imagine agora a seguinte situação:

Alice é a secretária de um deputado mensaleiro e está no gabinete.

Bob é um deputado mensaleiro que está em viajem para tratar de assuntos importantes para a nação em alguma praia do nordeste e cuidar pessoalmente das obras que ele tanto batalhou para a liberação da propina verba.

Eva é uma agente da policia federal encarregada de descobrir a maracutaia, e prender os corruptos. Bob e Alice sabem que todos os telefones, e-mails, etc  estão grampeados. Porém Bob precisa pedir para a Alice a transferência de 10 bilhões de reais da previdência social para sua conta bancária na suíça – afinal de contas, ele quer ter uma aposentadoria estável. Como Bob conseguirá enviar a mensagem para Alice?

Bob não havia combinado previamente uma senha com Alice, e todos os telefones, faxes, emails, estão grampeados. Não há uma forma segura de Bob mandar uma senha para Alice sem que a Eva saiba a senha. Por não haver um canal seguro para a transmissão da senha de criptografia simétrica, não há como utilizar esta criptografia diretamente. Bob então vai no google e encontra um artigo sobre criptografia assimétrica em um blog.

A criptografia assimétrica funciona da seguinte forma:

Existem duas chaves: A chave publica, e a chave privada. Os dados codificados pela chave publica só podem ser decodificados pela chave privada, e os dados codificados pela chave privada só podem ser decodificados pela chave publica.

A chave privada deve ser mantida sobre sigilo absoluto, enquanto a chave publica deve ser enviada a todos que quiserem mandar uma mensagem cifrada para o dono da chave privada.

No exemplo acima, Bob gera um par de chaves (uma publica, uma privada) e envia a publica para a Alice. Eva, que está na escuta, intercepta a chave publica de Bob.

Alice também gera um par de chaves, e envia a publica para Bob. Eva intercepta a chave publica de Alice.

Bob criptografa a mensagem “Transfira 10 bilhões de reais para a minha conta na suíça” usando a chave publica de Alice, e envia para Alice. Alice usa sua chave privada para descriptografar a mensagem, e usa a chave publica de Bob para codificar a mensagem “Feito sr deputado. Será transferido, bjo me liga!”. Bob, ao receber a mensagem, usa a sua chave privada para decodificar.

Eva, a policial, interceptou todas as mensagens, porém todas estavam codificadas, e todo seu esforço foi em vão, e não há nada que ela possa fazer para ler estas mensagens (será?).

Após esta breve explicação, vamos fazer uns pares de chaves?

O primeiro passo é criar a chave privada, usando o comando:

openssl genrsa -out chaveprivada.key 1024

o sistema responderá com:
Generating RSA private key, 1024 bit long modulus
……………++++++
……………..++++++
e is 65537 (0x10001)

Foi criado um arquivo com uma chave privada RSA de 1024bits.

Para entender o comando:

openssl – o programa openssl…
genrsa – Informa que deverá ser gerado uma chave privada RSA
-out <arquivo> – informa o arquivo aonde esta chave será salva.
1024 é o tamanho da chave. Escolhi 1024 pois é rápido de gerar. Para aplicações reais, tente 2048 ou 4096 – é bem mais seguro.

O arquivo de chaveprivada.key conterá a chave gerada, e, neste caso, contém o seguinte conteudo:

—–BEGIN RSA PRIVATE KEY—–
MIICXwIBAAKBgQDBsKuPV9NNivV62Nh3lN1tLCZ5eqHweUoCj0uxiEDES9nbko/8
wBppZStAdeKJXF9P9ZzZh+MikeBq9NhJF+GvXS4VjzHRwx76TGjzJPUzi8N5rwBB
WsvnIexX+w42cKsdYUj/X5S5acrIjLryt7/Hp5jne7ql/rKtsKhos9BjcQIDAQAB
AoGBAK+iqK9fEHjsXRV8tS4ai3+H3YuirF4HXhlcH2NpDnHx5ie5i1/CQzD3UHUv
cLDmVneHXSfUlR6v8TSLueTuBvMLHf0+0IRIUKQQnlwR2u/CksWnSsPvuYJJeKf+
eT0+O33fJvwZ6ez3VA0vncimmoyUSnLvp21GHcTwmWO9JhRRAkEA/H6l3iCRF9o9
gOrFLUIUXxXHlrL7iAt8RGNIDvVuQGwHT3rpPQbBHzrY68OMgDyyUC5Telx8aV7C
6GmuuZfkywJBAMRhCLLrtdX2eRJnrElg7FqfW8sj0YVcfJDhKFwGDZ06mxBRySSu
tqc50EmBsZDo2lAzZArnURHpXXYLHk1ejTMCQQC+mtiZu1nseKpPJGsexDBeqzFV
GN36kDkJ4yylZi8JYMOQA0gI8o1dBu5z49WvhKJTFvWbfC/K12cpTYZBwmFLAkEA
vbDhXzsSbThk4ONl54eJJ0xxtbrGo6Sf6q6jdqieM/ctW8k0m4tsggH1cVum8swK
PZg2ldW1WLDsB59byO6BQwJBAK91HlceVUQDjUbn5yijqhn1FDJm9QY4JqLfHDnu
Y88r+G8o/mhWnAK2kMPHjBN0AlP6G+4+dpNheGwNVpKFxRg=
—–END RSA PRIVATE KEY—–

O arquivo de chave privada NUNCA deve ser publicado (neste caso fiz uma exceção para fins pedagógicos!)

O segundo passo é extrair a chave publica deste arquivo:

openssl rsa -in chaveprivada.key -pubout -out chavepublica.key

Será criado um arquivo chamado chavepublica.key, com o seguinte conteudo:

—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBsKuPV9NNivV62Nh3lN1tLCZ5
eqHweUoCj0uxiEDES9nbko/8wBppZStAdeKJXF9P9ZzZh+MikeBq9NhJF+GvXS4V
jzHRwx76TGjzJPUzi8N5rwBBWsvnIexX+w42cKsdYUj/X5S5acrIjLryt7/Hp5jn
e7ql/rKtsKhos9BjcQIDAQAB
—–END PUBLIC KEY—–

Pronto. Temos a nossa chave privada e a chave publica! Agora o deputado Bob já pode conversar com a secretaria de gabinete Alice sem a policial Eva saber do conteúdo da conversa!

Mas, como ele codificará a informação?

Alice, ao receber a chave publica de Bob, salvou ela com o nome de chavepublica.key.

Então, tudo o que alice precisa fazer para enviar uma mensagem para Bob é executar o seguinte comando:

openssl rsautl -in texto_plano.txt -out texto_cifrado.bin -pubin -inkey chavepublica.key -encrypt

Openssl – o comando openssl….
rsautl – opção que diz ao openssl que iremos criptografar/descriptografar usando chaves assimétricas rsa.
-in <arquivo> – Arquivo de entrada (no caso, texto plano)
-out <arquivo> – arquivo com o conteudo resultante da operação (no caso, texto cifrado)
-pubin – informa que usarei uma chave rsa publica
-inkey – arquivo contendo a chave
-encrypt – informa que desejo ENCRYPTar a informação.

o arquivo gerado, texto_cifrado.bin, é gerado em formato binário, como possui caracteres não imprimíveis, não colarei ele aqui.

Bob recebeu o arquivo, ele precisa descriptografar, logo, ele precisa executar o seguinte comando:

openssl rsautl -in texto_cifrado.bin -out texto_decifrado.txt  -inkey chaveprivada.key -decrypt

Openssl – o comando openssl….
rsautl – opção que diz ao openssl que iremos criptografar/descriptografar usando chaves assimétricas rsa.
-in <arquivo> – Arquivo de entrada (no caso, texto cifrado)
-out <arquivo> – arquivo com o conteúdo resultante da operação (no caso, texto plano)
-inkey – arquivo contendo a chave (neste caso, a chave privada)
-decrypt – informa que desejo DECRYPTar a informação.

Porém, há um problema: Este sistema funciona apenas com uma quantidade pequena de dados: Não é possível, por exemplo, codificar 10MB usando este comando. A criptografia assimétrica exige muitos recursos computacionais, o que a torna proibitiva para codificação de grande quantidade de dados. Se Alice quisesse enviar para Bob um arquivo de 30Mb contendo dados sigilosos, ela teria que criptografar usando criptografia simétrica, e enviar a chave para Bob usando criptografia assimétrica. Alice pode ser mais esperta ainda: Ela pode usar o próprio OpenSSL para gerar a chave assimétrica! Observe:

openssl rand -out chavesimetrica.key -base64 32

gera um arquivo chamado chavesimetrica.key contendo 32bytes de dados aleatórios codificados em base64 (usando somente caracteres imprimíveis). No meu caso, o conteúdo do arquivo foi: 0nPLZbAWVbyNks3AGB4LMgk2pLUesrcV07s9qkjb5EY=, o que é uma bela senha!

em seguida, ela executa o seguinte comando:

openssl enc -aes256 -kfile chavesimetrica.key -in arquivode30MB.dat -out arquivode30MBcifrado.dat

que codifica usando a chave contida no arquivo chavesimetrica.key o arquivo de 30Mb q Alice quer enviar para Bob.

Por fim, Alice codifica a chave simétrica usando rsa:

openssl rsautl -in chavesimetrica.key -out chavesimetricacifrada.key -pubin -inkey chavepublica.key -encrypt

Agora é só enviar por e-mail os arquivos chavesimetricacifrada.key e arquivode30MBcifrado.dat para Bob e pronto – dados transferidos de forma segura, sem que a EVA saiba o que se passou. Repare que o trabalho pesado (criptografar os 30Mb) é feito por criptografia Simétrica. Este é um dos princípios de sites seguros (o cadeadinho do navegador), cartões bancários com chip, entre outras tecnologias.

No proximo artigo falarei sobre algoritmos de Hash.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: