Tenho certeza que você já ouviu falar em criptografia, certo? Historicamente falando, ela era associada à guerra, por ser essencial para trocar mensagens sem que o inimigo consiga ler. Com a internet, a segurança de dados tornou-se uma das principais preocupações da atualidade e a criptografia passou a ser fundamental para garantir a transmissão segura de dados como transações financeiras, informações pessoais e conversas privadas.
Mas para o que ela serve, afinal? A criptografia tem dois propósitos principais: impedir que dados armazenados sejam lidos e permitir que dados sejam transmitidos de forma segura por um canal inseguro. Isso significa manter a confidencialidade, integridade e identidade desses dados. Veja na prática:
Se Alice quiser enviar uma mensagem a Bob sem que Eve possa interferir, a criptografia permite:
Confidencialidade: Eve, o bisbilhoteiro, não consegue entender a mensagem;
Integridade: Eve, o bisbilhoteiro, não consegue modificar a mensagem;
Identidade: Bob pode confirmar que a mensagem foi enviada por Alice.
Então, resumindo, ela consiste em codificar uma informação de forma que ela seja compreensível apenas para aqueles que devem ter acesso à ela. E isso é feito através de um segredo: toda criptografia envolve algum tipo de segredo e espera-se que apenas quem tiver acesso a ele seja capaz de entender aquela informação.
Do começo
Antes de começar a explicar os tipos de criptografias que existem, tenha em mente esses termos, eles irão te ajudar a entender a lógica mais facilmente:
- Texto claro (ou plano): Informação legível, que pode ser compreendida por qualquer um que tiver acesso a ela
- Texto criptografado (ou cifrado): Informação incompreensível para aqueles que não devem ter acesso a ela
- Criptografar (ou cifrar): Utilizar um segredo para transformar um texto claro em texto cifrado. Pode ser revertido (descriptografado ou decifrado) por aqueles que souberem o segredo correto
- Algoritmo: Sequência finita de operações realizadas sobre um ou mais dados de entrada para gerar um dado de saída
- Cifra: Algoritmo utilizado para criptografar ou descriptografar dados
Uma das mais simples e conhecidas técnicas é a Cifra de César, em que as letras da mensagem eram deslocadas em três posições em relação à ordem alfabética. Por exemplo: "A" se torna "D", "B" se torna "E", "Z" se torna "C". Esse é um exemplo de cifra extremamente simples, e possui dois grandes problemas: depender de segurança por obscuridade e vazamento indireto de informações.
Segurança por obscuridade
A segurança por obscuridade consiste em confiar que um sistema é seguro por ninguém saber como ele funciona. Ou seja, o único segredo utilizado pela cifra é o seu modo de funcionamento. E por que isso é ruim? Porque as chances desse sistema ser ineficaz são muito grandes! Quando há diversos especialistas em criptografia analisando determinado sistema, as chances de se encontrar falhas são muito maiores. Isso quer dizer que, se o "segredo" de uma cifra estiver no funcionamento da máquina (ou algoritmo), bastaria ter acesso a ela (ou ao código) pra conseguir decifrar qualquer mensagem cifrada por ela. Como diria Claude Shannon, matemático americano, "O inimigo conhece o sistema".
Mas como resolver, então? Utilizando, como segredo, uma "chave" que, nesse caso, é uma sequência de símbolos utilizada para criptografar e descriptografar uma mensagem. Nesse sentido, existe o Princípio de Kerckhoffs, que complementa a Máxima de Shannon e diz que um sistema criptográfico deve ser seguro mesmo que tudo sobre ele, exceto a chave, seja conhecido publicamente. Então, entende-se que é muito mais seguro utilizar uma chave como segredo porque, caso ele seja comprometido, basta trocar de chave. Muito mais simples do que trocar de método!
Um exemplo disso é a Cifra de Vigenère que, apesar de ser semelhante à cifra de César, utiliza uma palavra-chave (em vez de um número fixo) para definir o deslocamento das letras da mensagem. Essa técnica “resolve” o problema da segurança por obscuridade, mas essa cifra também sofre o problema de vazar informações indiretas, caso seja usada uma chave menor do que a mensagem.
Informações indiretas
As duas técnicas que falamos acima têm o mesmo problema de vazamento indireto de informações, que são, justamente, os padrões. Mas como acontece esse vazamento? Uma das ferramentas mais comuns para a quebra de criptografia é a análise de frequências de símbolos, frases e padrões. Então, caso esses padrões sejam identificados na análise, o vazamento pode acontecer.
Um exemplo simples: a letra mais comum na língua inglesa é E, como mostramos no gráfico abaixo.
Utilizando uma cifra simples como a de César, esse gráfico de distribuição iria continuar igual, mas "deslocado". Nesse exemplo, a letra H seria a mais frequente. Uma boa cifra deveria resultar em uma distribuição mais uniforme (com as barrinhas mais ou menos do mesmo tamanho). Esse exemplo vale para letras, palavras, imagens, entre outros.
Por isso, uma cifra realmente segura precisa gerar códigos que pareçam completamente aleatórios, sem nenhum tipo de padrão, para que não seja possível encontrar uma correlação entre a informação secreta e o código gerado.
Para ter essa propriedade, a cifra deve utilizar uma chave longa e imprevisível. Uma chave curta ou previsível irá expôr padrões que a cripoanálise moderna é capaz de quebrar.
Perfeitamente seguro x Seguro na prática
Bom, agora que mostramos as possíveis falhas, vamos falar sobre a segurança. A única técnica criptográfica que foi matematicamente provada ser impossível de quebrar foi a One Time Pad (OTP), ou Chave de uso único. Com ela, mesmo que alguém disponha de tempo e recursos computacionais infinitos, não seria possível quebrar a criptografia.
A OTP possui quatro condições que precisam ser satisfeitas para que a segurança perfeita seja alcançada. A chave precisa ser:
- Gerada de forma verdadeiramente aleatória
- Pelo menos tão longa quanto a mensagem a ser cifrada
- Nunca reutilizada, completa ou parcialmente
- Mantida completamente em segredo
Problema resolvido, então? Mais ou menos... Isso porque, tais condições fazem com que o seu uso não seja eficiente para aplicações no mundo real. Então, na prática, as cifras que são realmente utilizadas baseiam-se em problemas matemáticos computacionalmente difíceis; que, por exemplo, o melhor supercomputador que existe levaria milhões de anos para resolver.
As chaves dessas cifras não seguem condições tão rígidas para serem consideradas impossíveis de quebrar: a condição de que quanto mais longa e aleatória a chave, mais difícil de quebrar, ainda é válida; mas elas são reutilizadas e, também, usadas para mensagens de todos os tamanhos, o que não encaixa nos requisitos.Por isso, dizemos que a criptografia que realmente é utilizada não dá garantia de segurança perfeita, mas de segurança para efeitos práticos.
Tipos de algoritmos
Algoritmo de Chave Simétrica
Algoritmos de Chave Simétrica são cifras em que a mesma chave é utilizada para criptografar e descriptografar uma informação. Dentro disso, atualmente o mais utilizado é o AES (Advanced Encryption Standard), que é seguro e rápido.
Entretanto, quando se fala em comunicação segura pela rede, esse tipo de algoritmo precisa ser utilizado em conjunto com outros; afinal, os interlocutores precisam compartilhar um segredo, mas como estão se comunicando em um canal inseguro, só ele não basta.
Algoritmo de Chave Assimétrica
Algoritmos de chave assimétrica utilizam um par de chaves complementares: o que é criptografado por uma pode ser descriptografado somente pela outra, e vice-versa. São utilizadas mantendo-se uma chave pública, que pode ser fornecida a qualquer um, e outra privada, que apenas o dono deve ter acesso. O algoritmo mais utilizado atualmente é o RSA (Rivest-Shamir-Adleman).
Na prática, funciona assim: Bob pode utilizar a chave pública de Alice para cifrar uma mensagem e enviar para ela sem o risco de que a mensagem seja entendida por terceiros, já que apenas Alice conseguirá descriptografá-la, por possuir a chave privada.Por serem muito mais lentos do que os algoritmos de chave simétrica (principalmente para mensagens longas), eles costumam ser usados somente no início de uma comunicação, para o estabelecimento de um segredo compartilhado entre os interlocutores. Para cifrar e decifrar as demais mensagens da comunicação, utiliza-se um algoritmo de chave simétrica, que é muito mais rápido, com a chave sendo o segredo compartilhado.
Função Hash Criptográfica
Uma função hash é uma função que transforma uma sequência de símbolos de tamanho qualquer, como uma mensagem, em uma sequência de tamanho fixo. Também são chamadas funções de resumo.
Essas funções têm um papel bem diferente das cifras, afinal, ao criptografar uma informação, nós queremos ter a possibilidade de descriptografá-la. A importância da função hash está relacionada com a garantia de integridade e identidade de informações trocadas, através da Assinatura Digital:
Uma função hash criptográfica tem a propriedade de ser extremamente difícil de reverter - por isso, são chamadas de funções unidirecionais. O que isso significa? Que para qualquer dado, é extremamente rápido (para um computador) gerar o seu hash - mas, tendo apenas o valor de um hash, é extremamente difícil (mesmo para um computador) descobrir qual era o dado original.
Veja um exemplo de função SHA1:
- oi -SHA1→ ef67e0868c98e5f0b0e2fcd9b0c4a3bad808f551
- ou -SHA1→ d5f10c9bc8370694a415ccbaabcb062e36948c5a
- ornitorrinco -SHA1→ 561b4e941893e7b3d14a5c89cce74a2d7d471ec3
Perceba que uma pequena mudança no dado de entrada altera completamente o resultado! Além disso, o tamanho do resultado é fixo, independe do tamanho da entrada.