Você está na página 1de 17

Introdução a criptografia

Este artigo não descreve algoritmos de criptografia nem ensina a quebrá-los. Trata-se de
uma introdução. Se você não sabe a diferença entre chave e senha, ou entre algoritmos
simétricos e assimétricos, se não sabe o que é o ataque de força bruta e quantos bits
precisa ter para ser seguro, então este artigo poderá lhe ser útil.

Por: Elgio Schlemer

Fonte: http://www.vivaolinux.com.br/artigo/Introducao-a-criptografia/
Sumário
Introdução.............................................................................................................................................1
Conceito de chave.................................................................................................................................3
Ataque por força bruta..........................................................................................................................4
Ataque por criptoanálise.......................................................................................................................6
Simétricos ou assimétricos?.................................................................................................................8
O que temos até agora?....................................................................................................................8
Criptografia nos dias de hoje..............................................................................................................11
Conclusões..........................................................................................................................................13
Referências.........................................................................................................................................14
Introdução
O desejo de enviar mensagens de forma segura sem que ninguém mais, a não ser o destinatário,
consiga ler, é tão antigo quanto a invenção da escrita. Em guerras primitivas tem-se relato de
generais que raspavam a cabeça de um escravo e sobre a cabeça escreviam mensagens secretas de
guerra. Após o cabelo crescer, o emissário era enviado (esta técnica de esconder mensagens é
chamada de esteganografia e sua versão moderna consiste em esconder mensagens em imagens ou
músicas).

Basicamente existem duas formas primárias de obscurecer uma mensagem (criptografar), que pode
ser pelo uso de substituição ou transposição. Na substituição troca-se alguma coisa por outra, de
acordo com algum critério. Os passatempos encontrados em bancas de revistas exploram a
substituição, onde o leitor é levado a descobrir que onde tem triângulo deve ser considerado a letra
"A", por exemplo.

Já na transposição apenas troca-se as coisas de lugar. Usando transposição simples, pode-se


escrever a palavra "teste" como "ettse", transpondo uma letra com a sua vizinha.

O método matemático de substituição para inviabilizar a leitura mais antigo que se tem registro é a
cifra de César. Elaborada por Júlio César, esta cifra inaugurou as chamadas cifras de substituição
monoalfabéticas.

Na infantil Cifra de César, cada letra do alfabeto é substituída pela sua terceira vizinha, ou seja, o
"A" é transformado em "D", em um alfabeto circular, onde o "Z" vira "C" (...VWXYZABC...),
conforme ilustrado na figura.
Linux: Introdução a Criptografia

Nota-se aí a existência de duas operações distintas:

a) cifrar: para cifrar uma mensagem, deve-se substituir cada letra pela terceira vizinha subsequente.
Em C usando string isto poderia ser feito com:

strCIF[i] = strTXT[i] + 3;

No entanto, um programador experiente verá erro na fórmula acima: ela só funciona até o "W" que
somado com 3 virará "Z". Para as letras "X", "Y" e "Z" a fórmula é falha! Aí entraria em ação a
operação de módulo, muito utilizada em criptografia (fica como dever de casa).
b) decifrar: já para recuperar a mensagem outro método matemático precisa ser usado. Ao invés de
trocar pela terceira subsequente, deve-se trocar pela terceira anterior ("D" deve virar "A"). Percebe-
se nitidamente duas operações distintas para cifrar ou decifrar.

Uma variação interessante da cifra de césar é a Rot13, onde se troca pela décima terceira vizinha.
Ela é interessante pois como o alfabeto tem exatos 26 letras, o processo de cifrar e decifrar é o
mesmo! Para cifrar basta achar a vizinha 13 subsequente e para decifrar também (a vizinha de "A" é
"M" e a vizinha de "M" é o "A").

Ninguém irá cifrar nada sério usando César. Serve apenas como fundamento didático para explicar
alguns conceitos, como o de chave, por exemplo.
Conceito de chave
A Cifra de César não tem chave. Toda a "segurança" está na descoberta do método matemático. Se
alguém descobrir que deve-se somar 3, acabou o algoritmo.

Outro problema da Cifra de César é que se eu compartilho o método com 10 pessoas, todas as 10
estarão aptas a ler todas as mensagens. Mas se eu quisesse, usando esta cifra, trocar uma mensagem
cifrada com a pessoa A, mas de forma que a pessoa B não possa ler, mesmo sabendo o método?

Uma variação da Cifra de César consiste em trocar a letra pela vizinha k ao invés da 3. Se eu usar k
como 3, terei que o "A" troca por "D". Se eu usar k=6, terei que o "A" troca por "G", e assim por
diante. A ideia deste algoritmo é que todos conheçam o método (trocar por uma vizinha), mas
ninguém sabe por qual vizinha é.

Neste caso eu poderia combinar com a pessoa A que sempre que enviasse uma mensagem para ela
eu usaria k como 3. Já com a pessoa B eu combino k=6. Todos conhecem o método, mas a pessoa B
não saberia como ler mensagens que enviei a pessoa A pois ela não sabe que com A eu usei k=3.

Eis o conceito de chave. O método é o mesmo, mas a chave (k) varia.

Considerando que a pessoa B queira muito ler a mensagem que eu enviei para a pessoa A, tudo que
ela precisa é descobrir qual valor de k eu usei para o A, já que o método é o mesmo. A ideia é que
não exista segredo algum no método de criptografia (muito embora alguns fabricantes insistem em
basear sua segurança nisto).

E como pode ser feita esta descoberta? Uma das forma é através da força bruta.
Ataque por força bruta
Neste tipo de ataque testa-se todas as possibilidades de chave possíveis, até encontrar uma que
sirva.

Voltando ao infantil método de César com a modificação e presença do k, se B quisesse muito saber
o que escrevi para A, ele poderia tentar usar os possíveis valores de k até que a mensagem faça
sentido. Neste caso k pode assumir uma variedade limitada de valores. Ele pode ser 0 (onde "A"
seria trocado pelo mesmo "A". Ridículo, mas matematicamente é uma chave viável), pode ser 1, 2,
3, ... 25, sendo que neste último o "A" seria trocado pelo "Z".

Veja que existem apenas 26 possíveis valores para k neste método. Um ataque por força bruta não
exigiria mais que 26 tentativas.

Matematicamente se usa a estatística aqui, sendo que ninguém é tão sortudo para acertar na primeira
tentativa e nem tão azarado para acertar na última! Na média se considera que o ataque terá sucesso
em 13 tentativas.

Logo, neste caso, um ataque por força bruta terá um esforço médio de 13 tentativas. Se eu usar
papel e caneta (como devia ser no tempo de César) e conseguir testar no ritmo de uma tentativa por
minuto, levaria 13 minutos em média para quebrar o algoritmo. Este seria o esforço de um ataque
de força bruta à Cifra de César, o que o torna, como disse, infantil.

Mas se eu mudasse a cifra monoalfabética um pouco. Se ao invés de ter que trocar uma letra por
uma k vizinha eu usasse uma tabela de trocas:

Letra A B C D E F G H I J K L M ...
troca X J M A F W C N O K B E T ...

Será que um ataque de força bruta seria possível com este novo algoritmo?

Um ataque de força bruta sempre é possível, a questão é quanto tempo em média ele levaria. O
tempo é de acordo com as possíveis combinações de chave. Neste caso de um algoritmo
monoalfabético com uma tabela de troca, cada letra pode ser uma das outras 25, sem poder repetir,
ou seja, se já decidi que "A" troca pelo "X", ninguém mais poderá ser trocado pelo "X". A
matemática nos ensina que neste caso haverão 26! possibilidades (fatorial de 26) para a chave.

As aparências enganam, pois fatorial de 26 resulta em 403.291.461.126.605.635.584.000.000


possíveis valores para chave e isto é muito, mas muito mesmo.

Como calcular este fatorial no Linux? Usando bc, uma alternativa bem criativa é com o comando:

$ seq -s '*' 1 26|bc

O comando seq irá gerar a sequência:


1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26

que será avaliada pelo bc.

Se eu tivesse um computador capaz de realizar 1 bilhão de tentativas por segundo (1.000.000.000) e


tiver 1 bilhão destes computadores para uso, o ataque de força bruta ainda levaria 201.645.730
segundos, ou aproximadamente 6 anos de processamento!

Verifique você mesmo no bash:

$ echo "403291461126605635584000000 / 2 / 1000000000 / 1000000000 / 60 / 60 / 24 / 365" | bc

Divido o número de tentativas por 2, pois na média se acerta na metade das tentativas, divido pela
quantidade de quebras por segundo de um computador, que é um bilhão, divido pelo número de
computadores que tenho. Depois divido por 60 para transformar segundos em minutos, por 60
novamente para transformar em horas, por 24 tem-se dias e dividindo por 365 tem em anos.

Logo, por força bruta, este algoritmo de substituição monoalfabética é infalível e inquebrável,
apenas com o desconforto de ter que memorizar uma k que é uma tabela.

Costumo instigar meus alunos neste momento perguntando-lhes se está aí o algoritmo perfeito e
inquebrável! Então?

Por força bruta, SIM, eis um algoritmo ideal. Só que existem outros meios de se quebrar um
algoritmo de cifra que é através da criptoanálise.
Ataque por criptoanálise
O ataque por força bruta é possível em todos os casos. Ainda não existem algoritmos imunes a este
ataque, ou seja, ele sempre poderá ser tentado. A questão é o tempo que levará. Deseja-se um
algoritmo com tantas possibilidades de chave que o ataque levaria anos ou mesmo milhares de anos,
de sorte que ninguém sequer irá tentar este ataque por ser inviável (em tempo: estudos sobre
computação quântica sugerem a possibilidade da construção de algoritmos de criptografia imunes
ao força bruta).

A cifra de substituição monoalfabética com uma tabela de trocas, citada no capítulo anterior, é um
caso de um algoritmo para o qual demonstrou-se que o foça bruta é inviável. Mas existe a
criptoanálise.

Simon (ver referências) define a criptografia como a eterna guerra entre criptógrafos e
criptoanalistas. Um constrói para que o outro descubra como destruir! No caso mais específico da
substituição monoalfabética ela é frágil e sucumbe ao ataque de "Análise de Frequência".

Costumo brincar de forca com meus alunos nesta hora:

Vamos lá. Qual letra você escolheria?

Notoriamente todos começam tentando a letra "A" ou, no máximo, indo pelas vogais. Porque? Ora,
pelo simples fato de que em um texto em português a letra "A" é a letra que mais se repete! É
improvável que um texto não possua uma boa quantidade de letras "A"s. Isto é análise de
frequência.

Se estou tentando quebrar uma cifra monoalfabética (onde uma letra trocou por outra), sabendo que
o texto é em português a primeira coisa que faço é contar as letras. Se, e ao contar, descubro que a
mais repetida é o "W" é provável que o "W" está substituindo a letra "A". Onde tem "W" coloco
"A" e vou brincando até o texto fazer algum sentido para mim. No caso da forca, ao colocar a letra
"A" ficaria assim:

Vamos ver quem posta o primeiro comentário dizendo qual é a palavra!

Todo o algoritmo de substituição monoalfabético é vulnerável ao ataque de análise de frequência.


Se o texto for em inglês, sabe-se que a letra que mais se repete é o "E".

Mas entenda que substituição monoalfabética não quer dizer apenas letras assim como análise de
frequência não se aplica somente a letras que mais se repetem! Posso cifrar o arquivo binário com
uma tabela de 256 trocas, onde o byte 00000000 será trocado por 00110110, por exemplo, e assim
por diante.

Ainda é considerado substituição monoalfabética. No caso, se era um executável, posso realizar


análise de frequência nele, descobrir quais os bytes mais presentes em um EXE típico e usar o
mesmo princípio! Fabricantes de processadores fazem isto para descobrir as instruções mais usadas
em programas a fim de otimizá-las.

Logo, foi para o brejo nosso algoritmo perfeito: ele perece pelo ataque de "Análise de Freqüência".

Alternativas interessantes ao longo da história foram usadas para melhorar a cifra monoalfabética
como variar a troca para os mais frequêntes. Como exemplo, a letra "A", sendo a que mais se
repete, pode ser trocada por "X", por "#" ou por "*". Isto, se bem usado, evita a análise de
freqüência, mas impõe alguns problemas, como o fato do alfabeto de troca ter que possuir mais
símbolos que o original. Enfim, a cifra de Viginère resolveu de forma criativa este problema e ficou
inquebrável por séculos até que Babage a quebrou usando, pasmem, Análise de freqüência (Simon).

Ainda existem outras técnicas de criptoanálise como por exemplo as colas. Chama-se de cola
quando um atacante tem uma vaga ideia de trechos da mensagem. Na segunda guerra mundial os
alemães pisaram na bola neste sentido, pois toda a comunicação tinha a saudação nazista, logo ao
menos um trecho da mensagem era previsível (Simon). Hoje os modernos algoritmos de cifras
devem ser imunes as colas, ou seja, mesmo que eu lhe dê centenas de textos cifrados e as suas
centenas de textos originais correspondentes, ainda assim você não deve ser capaz de descobrir qual
chave eu usei (esta propriedade é muito interessante e parece utópica, mas não é).
Simétricos ou assimétricos?

O que temos até agora?

* método: o algoritmo matemático que faz a cifra e a decifragem. Não deve ser segredo.
* chave: único segredo. Uma informação que alimenta o algoritmo para cifrar ou decifrar. Quanto
mais possibilidades, mais inviável é o força bruta.

Assim como uma porta de uma casa com sua fechadura que só pode ser aberta por quem tiver a
chave. Considerando que a fechadura é a prova de criptoanálise, ou seja, a prova de "chaveiros", a
única forma de abrir a porta sem a chave correta é se um chaveiro viesse com uma sacola com todas
as possíveis chaves para aquela fechadura e ficasse tentando até uma servir. Se forem bilhões de
chaves possíveis, torna inviável (isto seria um força bruta).

Mas veja que neste exemplo a mesma chave que fecha também abre. Existe apenas uma chave e ela
serve para trancar a porta e também para destrancá-la! Neste caso tem-se o que se chama de
algoritmo simétrico, onde existe apenas uma única chave e ela serve para cifrar e decifrar.

Um problema crônico existe com os algoritmos simétricos e ele atormentou os cientistas durante
muito tempo: como pode ocorrer de forma segura a troca das chaves?

Se eu quero trocar uma mensagem com a pessoa B como conto ao B que usarei k=10 para cifrar a
mensagem? Se tiver a oportunidade de me encontrar pessoalmente com ele, ok, converso de forma
reservada e lhe conto a chave. Mas e se ele estiver distante, sem a possibilidade de um encontro
pessoal? Telefono para ele? E se alguém estiver com uma escuta telefônica? Envio um email? Veja,
não tem como realizar esta comunicação de forma segura.

Este problema atormentou muita gente. Na segunda guerra o livro dos códigos da Enigma, com
chaves diárias de um mês inteiro, era entregue em mãos aos operadores de rádio. Este tinha ordens
para, sob ataque, imediatamente destruir a máquina e o livro. Se os aliados tivessem acesso a este
livro seriam capazes de quebrar as comunicações de um mês inteiro (o filme "U-571 - A Batalha do
Atlântico" explora este fato, onde os aliados disfarçam um submarino como sendo alemão a fim de
tentar capturar a Enigma).

Simon conta detalhes deste fato histórico e revela que uma das primeiras formas que os aliados
acharam para ler as mensagens foi subornar um oficial alemão (depois eles quebraram com colas e
depois com máquinas implementadas por Alan Turing chamadas de "bombas")!

Seria possível a troca de chaves de forma segura usando um meio de comunicação inseguro? Isto se
consagrou como matematicamente impossível, exceto para os "loucos" Marin Hellman e Whitfield
Diffie. Loucos pois aparentemente estavam pesquisando algo impossível, para o qual já se havia
desistido: um algoritmo de troca de chaves seguro em um meio inseguro.

Este artigo ficaria muito longo se começasse a contar a história do famoso algoritmo Diffie-
Hellman e o quanto ele revolucionou a ciência da criptografia. Cabe apenas ressaltar o raciocínio
que embasou estes "loucos". Eles pensaram facilmente em um protocolo de troca de informações
sigilosas via correio. É interessante para ilustrar.

Imagine que quero enviar documentos sigilosos pelo correio para "P" e que eu não confio no
carteiro. Colocar os documentos em uma caixa com cadeado não serve, pois como enviaria a chave
do cadeado para o "P"? Pelo correio? Por teletransporte? Se não confio no meio, não adianta variar
os métodos usando este meio de transporte no qual não confio. Estamos falando de criptografia
onde se leva as teorias ao extremo.

Mas DH pensaram em um método (eu sou o "E" enviando documentos para "P"):

1. "E" compra um cadeado em uma ferragem;


2. "E" coloca os documentos em uma caixa e coloca o seu cadeado. Pressupõe-se que tanto a
caixa como o cadeado são invioláveis e que a única forma de abrir a caixa é com a chave;
3. "E" envia a caixa pelo Correio. Veja que ninguém poderá abir, pois "E" não enviou a chave. O
carteiro curioso nada pode fazer;
4. "P" recebe a caixa. Bom, "P" também não a pode abrir pois ele não tem a chave (surpreso?).
Mas "P" ao invés de abrir, compra o seu cadeado e coloca ele também na caixa. A caixa agora tem
DOIS cadeados: o de "E" e o de "P";
5. "P" devolve a caixa pelo correios ao "E";
6. Legal, agora nem mesmo "E" consegue abrir sua caixa. Mas ele apenas usa a sua chave para
tirar o seu cadeado, mantendo o cadeado de "P";
7. "E" devolve a caixa para "P" que agora pode abrí-la.

Observe que neste protocolo jamais houve uma troca de chaves. DH pensavam que deveria existir
um princípio matemático que reproduzisse este efeito e depois de muita pesquisa o encontraram na
aritmética modular usando números primos (mais tarde se soube que eles não foram pioneiros, pois
pesquisas secretas neste sentido haviam sido realizadas muitos anos antes).

Prometi que não ia falar do algoritmo de Diffie-Hellman e não vou. Apenas devo dizer que ele, em
sua forma original, é vulnerável e sua importância histórica é mais por ter abertos portas. O famoso
e ainda extremamente usado algorítimo RSA é baseado na mesma aritmética modular do DH.

Um algoritmo assimétrico, portanto, é quando se usa uma chave para cifrar, porém, magicamente,
esta chave não serve para abrir o que se cifrou. Não tem espaço aqui para explicar isto em termos
matemáticos (se alguém quiser, me peça), mas o fato é que tais algoritmos existem.

Muitos chamam estes algoritmos de chave pública e privada, mas o nome técnico deles é algoritmos
assimétricos. Esta confusão no nome é porque uma das chaves, normalmente a que serve para cifrar,
é tornada pública e a outra é mantida sob sigilo conhecida como chave privada (eu tenho que tomar
muito cuidado quando falo disto. Sempre "chave privada". Não foram poucas as vezes que me
peguei falando "Se você der a sua privada para o fulano").

Para entender os assimétricos eu uso uma excelente analogia! Voltemos aos correios e ao uso das
caixas. Tem uma maneira ainda mais eficiente de receber ou enviar documentos sigilosos.

Digamos que eu quero enviar um documento para "P". Bastaria isto:

1. "P" compra um cadeado e me envia ele ABERTO pelo correio. Não envia a chave;
2. "E" recebe o cadeado aberto de "P" e o usa para fechar a caixa. Uma vez fechada, "E" já não
tem mais condições de abrí-la;
3. "E" envia a caixa com o cadeado fechado de "P";
4. "P" a abre pois tem a chave.

Nesta analogia a chave pública seria o cadeado aberto: ele só serve para cifrar.
Estendendo a analogia, "P" poderia pedir a um fabricante de cadeados que confeccionasse milhares
de cadeados com a mesma chave. O cadeado de "P" estaria em todas as agências de correios, por
exemplo. Esta é a ideia.

Claro que para que isto funcione o cadeado deve ser forte e a chave deve possuir muitas
combinações, senão um ataque de força bruta seria viável. Deve também ser imune a criptoanálise,
ou seja, nenhum chaveiro do mundo seria capaz de construir uma nova chave apenas analisando o
cadeado.

Voltando aos termos "informáticos" a ideia do cadeado foi implementada pelo algoritmo RSA
baseado na fatoração de números primos. Constitui em duas chaves, uma chamada de Ke (K para
"e"ncriptar) e Kd (k para "d"ecriptar). Uma complementa a outra. O que cifra-se usando Ke apenas
com a Kd é possível recuperar (não vou descrever o funcionamento do RSA).

Um atacante conhece Ke pois a tornei pública. Contudo, mesmo tendo ela, ele está
computacionalmente inviabilizado de calcular Kd. RSA garante isto através do uso de números
primos gigantes, hoje com tamanhos de 512 bits.
Criptografia nos dias de hoje
Agora que os conceitos foram colocados, vamos aos fatos práticos.

Na informática tudo se resume a bits. Em um algoritmo de criptografia o que se mede é o tamanho


da chave em bits. Se uma chave possui 3 bits, ela pode ser uma dentre os seguintes valores:

000
001
010
011
100
101
110
111

Isto nos dá apenas 8 possibilidades para k. Na matemática, o número de possíveis chaves é de 2


elevando ao número de bits (23 = 8).

Assim sendo, se um algoritmo simétrico tiver 128 bits de chave, como é o caso do AES, significa
que ele tem 2128 possíveis chaves ou 340282366920938463463374607431768211456 (nem tente
ler este número!).

Lembra do nosso computador que testa 1 bilhão de possibilidades e do fato de dispormos de 1


bilhão destes para usar? Com este hardware eu levaria 170141183460469231731 segundos, já
considerando a metade das tentativas (2127: lembra? ninguém é tão azarado de acertar na última).
Em uma calculadora, dividindo isto por 60 para ter minutos, por 60 novamente para ter horas, por
24 para ter dias e por 365 para anos, chega-se a estrondosa quantia de 5.395.141.535.403 anos!

É pura falta de conhecimento de causa quem afirma que algoritmos simétricos de 128 bits são
quebráveis por força bruta. Só mesmo Dan Brown em seu livro "Fortaleza Digital" e seu
computador quântico de bilhões de bits para quebrar tal algoritmo!

Se considerar o AES128, não estou dizendo que ele é inquebrável pois pode ter fraquezas
exploráveis por criptoanálise. Se houver ou (a) não se descobriu ou (b) quem descobriu não nos
contou! O que estou afirmando é ser inquebrável quanto a força bruta!

Literaturas afirmam que um algoritmos simétrico de 256 bits tem segurança eterna, pois nem todo o
silício do universo daria para construir uma máquina que o quebrasse (parenteses agora: da maneira
como se constrói computadores hoje em dia. Alguns cientistas vem falando da computação quântica
e de como ela mudaria a maneira de fazer as coisas. Computação quântica é cercada de mistério e
de exageros. O fato é que já existe uma máquina com sete bits quânticos disponível).

Agora o que muitos realmente confundem é quanto a força bruta dos algoritmos assimétricos! É
muito, mas muito diferente!

Em um simétrico, se eu tenho 8 bits de chave, tenho 256 combinações possíveis.

Se pegar o caso do RSA que é um assimétrico e se tiver uma chave de 8 bits, significa que o valor
do N é de 256 bits. Sem querer descrever o RSA aqui, posso dizer que N é o resultado da
multiplicação de dois números primos de 4 bits. Quebrar a chave significa achar um destes
números. E não é de 2 elevado na 4 tentativas, pois os valores 2, 4, 6, 8, 9, 10 não precisam ser
testados pois não são primos!

No universo de 4 bits só existem estes primos: 2, 3, 5, 7, 11,13. Só! Mata-se em seis tentativas no
máximo!

Para algoritmos assimétricos, como no caso do RSA, o cálculo do esforço matemático não é
simplesmente de 2NumeroDeBits. É muito, mas muito menos que isto.

Exatamente por isto é que os algoritmos assimétricos precisam de uma chave muito maior, hoje
perto dos 1024 bits. No caso do RSA, dizer que ele é de 1024 bits, significa que o valor de N é de
1024 bits, logo quebrar significa encontrar um número primo de até 512 bits que sirva.

Aí tem gente que se acostumou a ver o RSA de 1024 bits e sai dizendo que um AES de 128 é fraco,
pois só 128 bits? São coisas diferentes, meu caro!
Conclusões
Este artigo é apenas uma introdução para, quem sabe, ser continuado em artigos futuros. Muita
coisa ficou de fora, como os tipos de cifras (de bloco, de fluxo), algoritmos de HASH e até mesmo a
descrição dos algoritmos. Entender o funcionamento de um RSA por exemplo é muito gratificante,
embora não interesse a maioria. Para nós o mais importante é saber como empregá-los e não os seus
princípios matemáticos. Se os matemáticos dizem que que é inviável, que seja. A gente acredita,
implementa e usa!

Deve-se dizer que os algoritmos assimétricos são extremamente onerosos, ou seja, consomem muita
CPU. Seu uso deve ser evitado ou, pelo menos, minimizado pois o processador agradece. Como os
simétricos são absolutamente seguros e rápidos, sendo seu único problema a troca de chave, é
comum usar um assimétricos apenas para trocar a chave convergindo após para um simétrico. O
protocolo SSL é exatamente assim (quem está por trás do SSH e o HTTPS, dentre outros).

De forma muito resumida, o que o SSL faz é mais ou menos o seguinte:

1. Cliente e servidor concordam em qual algoritmo simétrico irão utilizar. Exemplo: AES128;
2. Cliente solicita a chave pública do servidor (na prática chama-se certificado, mas como disse,
estou descrevendo de forma muito resumida);
3. Cliente escolhe aleatoriamente uma chave k de sessão;
4. Cliente cifra a chave que ele escolheu com a chave pública do servidor;
5. Cliente envia k cifrado para o servidor. Até ai se usou o algoritmo assimétrico;
6. Servidor recebe k cifrado, decifra com a sua chave privada;
7. Cliente e servidor agora conversam usando o AES128 usando a chave simétrica k.

Esta é a ideia, usar o oneroso algoritmo assimétrico apenas o necessário, nada além disto.

Outras aplicações muito populares usam vários tipos de cifras, cada uma dentro do seu contexto, de
forma que os assimétricos não estão ai para substituir os simétricos, mas sim para complementá-lo.
Um exemplo disto é quanto a assinatura digital que emprega algoritmo assimétrico e um de HASH,
igualmente para poupar esforço (pense em assinar um documento de 1GB. Rodar um assimétrico
sobre 1G é oneroso. Mas rodar ele sobre um HASH de 256 bits é bem mais prático).
Referências
Boa parte do que aprendi sobre criptografia eu encontrei no maravilhoso livro "O Livro dos
Códigos" de Simon Singh que, espero, não esteja mais esgotado. Ele é EXCEPCIONAL. Dou fé!
Este livro é gostoso de ler e pode ser apreciado até por quem não é da área. Não é exatamente um
livro técnico. Simon conta o uso da criptografia ao longo da história, sua presença em guerras e o
faz de uma maneira muito leve. A descrição matemática de alguns algoritmos ele traz em anexos.

Este livro é intrigante pois toda a sua narrativa é com a premissa de que criptografia é segredo.
Todos os grandes códigos bem como as grandes quebras só foram reveladas ao público muitas
décadas depois. Isto é inquietante pois deixa uma sensação de conspiração no ar, já que os maiores
salários nesta área são pagas por agências governamentais a pessoas completamente anônimas.
Quando a NSA ceifou o algoritmo Lucifer da IBM tirando 8 bits de sua chave para que virasse o
DES (originalmente ele era de 64 bits, foi reduzido para 56+8 bits de paridade) muitos disseram que
era pelo fato da agência ter meios de quebrar 56 bits, mas não 64 (NSA quer dizer National Security
Agency. Muitos fazem uma brincadeira com o nome dizendo que NSA quer dizer "No Such Agency
- agência inexistente).

O bem humorado autor (Simon) já coloca em sua introdução que ao final ele faz muitas
especulações sobre o que já existe e poderá existir. Ele diz que elas podem ser inverdades dado o
sigilo da área, mas que felizmente as únicas pessoas que podem apontar os erros no livro não o
podem fazer devido ao sigilo de seus empregos e ao seu anonimato! Enfim, garanto a qualquer um
uma excelente leitura.

Outros livros de criptografia se destinam a entrar fundo nos conceitos matemáticos e sua
exploração. Em um destes livros eu encontrei uma façanha interessante para quebrar o RSA o que
demonstra o quanto a criatividade é insuperável! Devido a sua matemática, algumas cifragens
podem levar muito mais tempo e outras menos tempo, dependendo da natureza da mensagem a ser
cifrada. Se um atacante tiver a possibilidade de medir o tempo que você leva para cifrar o que ele
quer, ele pode gerar textos bem formados e com a análise dos tempos de resposta que você levou
para cifrá-los, deduzir muitos bits da chave! Depois desta descoberta alguns algoritmos
deliberadamente inserem delays aleatórios para inviabilizar qualquer análise neste sentido. O livro
que descreve isto é o "Criptografia e segurança de redes", de William Stallings e disponibilizado
pela editora pearson em português. Este livro é excepcional se você realmente quer se aprofundar
muito nesta ciência (e prepare-se para uma enxurrada de funções matemáticas, familiarização com
termos como transformada de Fourier ou logaritmos discretos - o livro é bem pesado).

Caso se interessem por um algoritmo de troca monoalfabética, tem uma implementação minha em
C disponível em gravatai.ulbra.tche.br/~elgio/disciplinas/?DISC=outras&MAT=VOL (este
algoritmo eu escrevi atendendo pedidos ao tópico Criptografia em C).

Na mesma página também tem o código em PHP para implementar um RSA de 32 bits, mas como
eu não expliquei aqui como o mesmo funciona, torna-se sem sentido.

Também escrevi e postei aqui no VOL um artigo sobre senhas em Linux, explicando como a mesma
é gerada utilizando HASH. Ele pode ser obtido em Armazenamento de senhas no Linux.

Outro artigo de minha autoria descreve os algoritmos simétricos de bloco e de fluxo, que pode ser
acessado em Criptografia chave simétrica de bloco e de fluxo.

Outros artigos interessantes aqui no VOL merecem serem citados:


* Matheus Santana Lima escreveu em seu artigo Os segredos da criptografia com o Gcipher
como usar a ferramenta Gcipher, mas como todo bom artigo, enriqueceu muito o mesmo com
introduções e estórias da segunda guerra mundial, inclusive com fotos da Enigma. Ele não relata em
seu artigo, mas suspeito que o Matheus leu o livro do Simon!
* Ítalo Pereira de Brito fez uma boa introdução aos algoritmos simétricos, assimétricos e de hash
(que ele chamou no artigo de "uma via") em seu artigo Uma breve abordagem sobre Criptografia,
de 2006.
* Rodrigo Gomes, em seu artigo Conceitos de criptografia com chave simétrica e assimétrica de
2004, define bem os termos de confiabilidade, integridade e não repúdio, todos desejáveis em um
protocolo de criptografia. Ele também destaca a necessidade das chaves assimétricas.
* Por fim, um usuário anônimo que removeu o seu perfil, fez um interessante relato do que seria
a computação quântica em Criptografia quântica, embora o artigo seja uma cópia literal de um
capítulo da quarta edição do livro de Redes do Tanembaum. O livro do Simon também é muito bom
na definição da computação quântica.

Você também pode gostar