Criptografia Básica
===================
Funcionamento
-------------
Este não é um guia sobre criptografia, mas daremos os conceitos mais básicos
para que você consiga usá-la na vida prática sabendo em linhas gerais o que
está -- ou pelo menos deveria estar -- acontecendo na sua comunicação
criptografada.
A criptografia é o método de codificar dados e metadados para que a informação
possua um ou mais critérios de segurança como confidencialidade, integridade e
autenticididade.
Em sua aplicação mais básica, a criptografia é a técnica de codificar mensagens
de tal modo que apenas quem possuir o segredo de como decodificá-las pode
acessar seu conteúdo original.
A criptografia ainda pode ser utilizada para checar a autenticidade de uma mensagem,
ou seja, checar a autoria da mensagem, e ainda para verificar se a mensagem não
foi adulterada em seu trânsito.
Essas e outras propriedades da segurança da informação podem ser obtidas juntas
ou separadas dependendo do sistema criptográfico em uso.
A criptografia é baseada num processo onde a mensagem original é combinada com
uma chave de codificação e uma operação criptográfica para produzir um texto codificado:
::
mensagem original -> operação cifrar, chave -> mensagem codificada
Para obter a mensagem original a partir da mensagem criptográfica, é preciso
ter acesso a uma chave que permitae realizar uma operação no caminho inverso:
::
mensagem codificada -> operação decifrar, chave -> mensagem original
Como estamos lidando com criptografia em sistemas digitais, tanto a mensagem
original quanto a codificada e as chaves utilizadas são apenas números.
A mensagem codificada pode então trafegar por qualquer meio de comunicação,
pois suas propriedades de segurança da informação estarão operando. Ou seja,
essa criptografia, desde que bem implementada, oferece **confidencialidade**
à comunicação.
Por exemplo, se a mensagem codificada tiver a propriedade da confidencialidade,
ela só poderá ser lida por quem tiver condições de decifrá-la, isto é, por quem
tiver a chave de criptografia correta.
Existem dois tipos de chaves:
1. Chaves simétricas.
2. Chave assimétricas.
Veremos nos dois próximos capítulos como opera a criptografia com cada
uma delas.
Chaves simétricas
-----------------
Na criptografia baseada em chaves simétricas, ambas as partes de uma comunicação
compartilham a mesma chave criptográfica e esta é usada tanto para cifrar quanto
para decifrar mensagens.
Assim, é crucial para o funcionamento seguro da comunicação que a chave seja
mantida em segredo. Revelar a chave significa revelar a comunicação e até permitir
que terceiros possam usar a chave para enviar mensagens.
A criptografia de chave simétrica é bastante utilizada, porém na prática ela oferece
um problema: como compartilhar a chave entre as partes envolvidas?
No caso de duas pessoas se encontrarem pessoalmente para combinarem uma chave simétrica,
não há problema. Ou se a chave for transmitida de uma para outra num canal de comunicação
que ambas considerem seguros por terem efetivamente controle físico sobre ele.
Também não há problema no caso da criptografia usada para criptografar conteúdo
armazenado em discos, pois a chave não precisa ser transmitida.
Mas o que acontece se quisermos compartilhar a mesma chave com uma pessoa distante
e usando a internet como meio? Uma interceptação na comunicação poderia facilmente
capturar a chave durante sua transmissão, comprometendo toda a criptografia posterior.
E não poderíamos passar a chave usando uma comunicação criptografada, pois o outro
lado precisaria da própria chave para poder decifrá-la!
Uma das formas de contornar parcialmente esse problema é a utilização da
criptografia de chave assimétrica.
Chaves assimétricas
-------------------
Já a criptografia assimétrica é baseada em pares de chaves:
1. Uma chave pública, que pode (mas não precisa) ser divulgada amplamente.
2. Uma chave privada, que deve ser mantida em sigilo.
Cada parte envolvida na comunicação precisa de um par de chaves.
Suponha uma comunicação entre Fulana e Beltrana:
1. Fulana possui uma chave privada que chamaremos de Fulana Privada.
E uma chave pública que chamaremos de Fulana Pública.
2. O mesmo ocorre com Beltrana: ela tem uma chave Beltrana Pública
e uma Beltrana Privada.
A comunicação entra ambas funciona da seguinte maneira:
1. Fulana e Beltrana trocam suas chaves públicas. Isso quer dizer
que Fulana recebe uma cópia de Beltrana Pública. Beltrana, por
sua vez, recebe uma cópia de Fulana Pública.
2. Fulana pode criar uma mensagem para Beltrana usando o
seguinte caminho
::
mensagem original -> operação cifrar, chave Beltrana Pública -> mensagem codificada
Após receber a mensagem condificada, Beltrana pode decodificá-la
usando o esquema
::
mensagem codificada -> operação decifrar, chave Beltrana Privada -> mensagem original
Se Beltrana quiser responder com outra mensagem, ela deve seguir o seguinte
caminho:
::
mensagem original -> operação cifrar, chave Fulana Pública -> mensagem codificada
E Fulana poderá decifrá-la usando
::
mensagem codificada -> operação decifrar, chave Fulana Privada -> mensagem original
Na prática, com a criptografia de chaves assimétricas, só esses caminhos
são viáveis para codificar e decodificar mensagens.
Com o uso de computadores para a realização das operações, a criptografia
se torna prática e eficiente.
Identificação
-------------
A criptografia de chaves assimétricas resolve o problema da transmissão da
chave num meio desprotegido, já que a captura da chave pública por oponentes
não gera perigo adicional para a comunicação criptografada.
Mas essa transmissão de chaves não resolve um problema adicional: como garantir
que a chave não foi interceptada e substituída por outra, falsa?
E se alguém trocar a chave pública de uma pessoa por uma falsa e começar a
agir como se fosse essa pessoa?
Ou seja: como fazer a relação entre uma pessoa, instituição ou sistema e uma chave
pública? No nosso contexto de criptografia básica, podemos chamar esse processo
de **identificação** da chave pública: a quem ela pertence? Quem tem o controle
sobre ela?
A transmissão da chave pública não resolve todo o problema da segurança
da comunicação. Para confirmar se uma chave pública pertence a alguém,
precisamos ter alguma forma adicional para checá-la.
A maneira mais imediata é uma confirmação da chave pública ao vivo com
ambas as partes da comunicação certificando as duas chaves públicas, isto é,
uma chave pública por parte envolvida.
Ou então elas podem eleger um canal de comunicação que elas controlem ou
usar alguma outra forma de identificação: por exemplo, se as pessoas se conhecem
e concordarem com a relativa segurança do método, podem usar uma chamada telefônica
e ditarem um para o outro o conteúdo de suas chaves públicas.
Isso pode funcionar bem se um já conhece a voz do outro ou da outra e se
assumirmos que não existe um interceptador capaz de simular vozes convincentes.
O importante aqui é cada parte concordar com o processo de identificação.
Mas existe outro problema: muitos pares de chave que oferecem alguma segurança
tem um tamanho grande, o que complica muito a confirmação do tamanho da chave.
Para resolver isso utiliza-se a chamada **impressão digital** de uma chave pública,
como veremos no próximo capítulo.
Impressão digital
-----------------
Digamos que a impressão digital de uma chave seja sua versão resumida. É
possível que duas chaves públicas possuam a mesma impressão digital, mas isso é
muito difícil de acontecer. Sendo menor que a chave original mas ainda assim
praticamente única, é mais fácil utilizar uma impressão digital.
Impressões digitais existem tanto para criptografia simétrica quanto
assimétrica.
A impressão digital é uma sequência de números expressados tipicamente usando
o **sistema hexadecimal**, que utiliza os números de 0 a 9 e os algarismos de
A a F:
::
268F 448F CCD7 AF34 183E 52D8 9BDE 1A08 9E98 BC16
Muitos softwares de criptografia possuem uma função de identificação de chaves,
ajudando tanto no processo de identificação quanto informando ao usuário se
determinadas chaves dos seus contatos já foram identificadas.
Assinatura digital
------------------
Já vimos que podemos trocar chaves e fazer a identificação entre uma chave
e uma pessoa ou entidade. Queremos também ter um processo para checar se
uma mensagem foi enviada por determinada pessoa, entidade ou sistema.
Como podemos fazer essa verificação? Como podemos adicionar **autenticidade**
à nossa comunicação?
O próximo passo na criptografia é o uso das assinaturas digitais. Aqui
trataremos apenas do caso da criptografia assimétrica, onde uma assinatura
digital pode ser criada pelo seguinte processo:
::
mensagem original -> operação assinar, chave privada -> assinatura da mensagem original
Ou, alternativamente:
::
mensagem codificada -> operação assinar, chave privada -> assinatura da mensagem codificada
Ou seja, para a criação de uma assinatura deve ser utilizada a chave privada.
É possível também apenas assinar uma mensagem, sem criptografá-la, isto é,
sem codificar seu conteúdo:
::
mensagem -> operação assinar, chave privada -> assinatura
A mensagem -- codificada ou não -- pode assim ser transmitida num meio qualquer
juntamente com a assinatura e, na outra ponta, ser verificada.
Para checar a assinatura, a seguinte operação é usada:
::
mensagem, assinatura -> operação verificar, chave pública -> confirmação ou não-confirmação
Voltando ao nosso exemplo de Fulana e Beltrana, Fulana pode assinar uma mensagem
usando
::
mensagem -> operação assinar, chave Fulana Privada -> assinatura
Em seguida, Fulana envia a mensagem e a assinatura para Beltrana, que verifica
a procedência da mensagem usando
::
mensagem, assinatura -> operação verificar, chave Fulana Pública -> confirmação ou não
Ou seja, para criar a assinatura, Fulana usa sua chave privada, enquanto que
Beltrana pode checar a assinatura usando a chave pública de Fulana!
De quebra, a checagem de assinatura ainda oferece a propriedade da **integridade**
à nossa comunicação, já que mensagens que não puderem ter sua assinatura verificada
podem conter erros de transmissão ou terem sido adulteradas em trânsito.
Se a mensagem estiver apenas assinada, então uma interceptação poderá acessar
seu conteúdo, mas não conseguirá adulterar a mensagem sem que ocorra uma
falha na checagem da assinatura.
Em várias aplicações apenas a assinatura digital é utilizada, por exemplo para
permitir que um comunicado ou uma versão de um software publicamente distribuídos
possam ser verificados.
Mas, para proteger o conteúdo da mensagem, recomenda-se utilizar tanto a criptografia
do conteúdo quanto uma assinatura digital.
Tanto a mensagem original quanto a mensagem codificada podem ser assinadas e
essa é uma escolha que depende da implementação específica de criptografia que
está sendo usada. Em caso de possibilidade de escolha, assine e então
criptografe.
Certificação: a rede de confiança
---------------------------------
É possível até **assinar uma chave pública**:
1. Suponha que Fulana e Beltrana troquem chaves públicas e se identifiquem
mutuamente, ou seja, atestem de algum modo que as chaves públicas realmente
pertençam a uma e à outra.
2. Agora, imagine que Beltrana viaje para longe e encontre com Sicrana.
Beltrana e Sicrana também trocam chaves públicas e realizam a identificação
das chaves.
3. Mas Sicrana também quer ter alguma forma de identificar se a
cópia da chave de Fulana, com quem ela nunca encontrou, também é válida.
4. Se Sicrana confia em Beltrana enquanto capaz de identificar Fulana
corretamente, então Sicrana pode simplesmente consultar Beltrana a
respeito dessa identificação. Noutras palavras, Beltrana pode
**certificar** Sicrana sobre a chave de Fulana.
5. Uma forma de certificar uma chave pública é criar uma
assinatura nessa chave.
A certificação usando assinatura funciona de modo análogo à assinatura
de uma mensagem, com a diferença que a mensagem é a própria chave pública.
Assim, Beltrana pode criar uma assinatura da chave de Fulana, deixá-la
disponível publicamente ou então enviá-la para Sicrana.
Sicrana, por sua vez, pode checar essa assinatura e, caso a assinatura
seja válida e Sicrana confie na capacidade de Beltrana de realizar a
identificação correta de Fulana, ela pode também criar uma assinatura
sobre a chave de Fulana.
A certificação cria um esquema de cadeia ou rede de confiança que permite
que pessoas, instituições e sistemas distantes identifiquem-se uns aos
outros.
Note que a confiança aqui não implica em confiança irrestrita, mas apenas
uma atestação restrita de que determinada chave pública é considerada mesmo
como pertencente a determinada pessoa.
Esse conceito é muito útil na implementação prática da segurança da
informação e é utilizado diariamente, como você verá a seguir no guia.
Sigilo futuro
-------------
O último conceito sobre criptografia deste guia é chamado de **Sigilo Futuro**
e é muito importante para a proteção a longo prazo de uma comunicação.
Suponha que Fulana e Beltrana trocaram chaves públicas, se identificaram mutuamente
e usam criptografia para a comunicação diária.
Suponha que isso ocorra por muitos anos. E que por muitos anos um espião esteja
gravando toda essa comunicação.
Sem ter pelo menos uma das chaves privadas -- a de Fulana ou Beltrana -- o espião
não conseguirá fazer nada além disso: gravar as mensagens criptografadas.
Mas suponha agora que, num belo dia, o espião consiga roubar uma das chaves
privadas. A partir deste momento o espião pode decifrar retrospectivamente
todas as mensagens trocadas entre ambas as partes que sejam decifráveis com
a chave roubada. Se ambas as chaves forem obtidas, o sigilo de toda a comunicação
foi pro espaço.
E agora, o que fazer?
Bom, uma solução simples seria fazer com que Fulana e Beltrana destruíssem
periodicamente seus pares de chaves depois de substituí-las por pares novos.
Elas poderiam, antes de destruir as chaves antigas, usá-las para identificarem
as novas, num processo conhecido como **rolagem de chaves**.
Assim, se o espião capturasse uma chave privada, ele só teria acesso a um pedaço
menor da comunicação trocada.
Com isso, Fulana e Beltrana obtém uma propriedade da comunicação criptografada
chamada de **sigilo futuro**, que significa a proteção da maior parte da
comunicação no caso de perdas futuras de material criptográfico.
O sigilo futuro pode ser obtido manualmente com a rolagem periódica de chaves,
mas também pode ser feito automaticamente. Alguns sistemas criptográficos possuem
modos de operação com sigilo futuro.
Ataques
-------
Do que falamos até agora, podemos extrair diversos ataques a sistemas criptográficos
e incluir mais alguns outros:
1. O sistema criptográfico pode ter falhas conceituais: neste caso, o próprio princípio
ou a matemática do sistema possui falhas que podem ser exploradas para quebrar
a segurança da informação.
2. O sistema criptográfico pode ter falhas na implementação: aqui, é o hardware ou o
software criptográfico que apresenta defeitos que podem ser usados para
quebrar a segurança.
3. O sistema criptográfico pode ser mal utilizado, quando o uso incorreto de um sistema
ocasiona em quebras na segurança. Isso depende muito de onde e como um sistema
é usado, do nível de conhecimento de quem o utiliza e assim por diante.
4. Roubo de material criptográfico, isto é, roubo de chaves privadas. Isso pode
ser usado para forjar mensagens e assinaturas e também para decifrar mensagens.
Alguns ataques podem levar a outros: falhas conceituais, de implementação ou
de uso podem levar ao roubo do material criptográfico.
É importante saber que a criptografia não resolve tudo. Ela não é o remédio para
todos os problemas de insegurança na comunicação digital. Mas ela é uma medida
importante e necessária.
A criptografia também não é infalível. Ela é baseada no conhecimento matemático
e na capacidade técnica de um dado momento da história. Nada garante que, num dado
momento, não seja descoberta uma forma de detonar um sistema.
Isso é o equivalente a dizer que é possível num dado momento a descoberta de falhas
conceituais ou de implementação no sistema criptográfico.
É possível até que alguém já saiba fazer isso, mas que prefira manter esse
conhecimento em segredo por razões óbvias: se a falha se torna pública, ela
pode ser corrigida ou o sistema ser substituído.
Mas, nesses casos, não é apenas a sua criptografia que vai por água abaixo, mas
a criptografia utilizada por milhões de pessoas, por empresas e instituições.
Até onde sabemos, o conhecimento e a capacidade dos atores mais poderosos hoje
no mundo não é capaz de quebrar uma criptografia forte e bem implementada. Ao invés
disso, esses atacantes tem investido na **trapaça** e em métodos de invasão que
contornem a criptografia explorando outras vulnerabilidades nos sistemas.
Defesas
-------
O que é uma criptografia forte e bem implementada? Como podemos avaliar isso?
Para responder essa pergunta, seria necessário entrar nos detalhes de como
a criptografia funciona, o que deixamos para as nossas referências do guia.
Se não temos condições, pelo menos no momento, de entender mais como a
criptografia funciona, podemos ao menos confiar na opinião da comunidade de
segurança sobre quais padrões de criptografia são recomendáveis.
O mesmo acontece com as implementações, isto é, os softwares que utilizam
de determinados processos criptográficos.
Isso significa que não devemos usar um software que se diz seguro apenas
por sua propaganda, porque o site dele é bonito ou porque ele possui um
cadeado no seu logotipo. Existem centenas de softwares que se propõem como
alternativas viáveis para comunicação segura.
Então tome cuidado e use apenas softwares que você pode avaliar a segurança por
conta própria ou confie na opinião da comunidade de pesquisa.
Além desta importante observação, seguem outras dicas:
1. Proteja as suas chaves privadas! Você pode usar até a criptografia
de armazenamento do seu dispositivo para isso, como veremos adiante.
2. Mantenha seus softwares de criptografia sempre atualizados. Softwares
desatualizados podem conter falhas conhecidas e portanto fáceis de
serem exploradas por qualquer pessoa.
Muitos sistemas possuem procedimentos automáticos de atualização
que já dão conta disso. Outros precisam que a atualização seja
feita manualmente de tempos em tempos. Existem, ainda, fontes de
notícia de softwares ou de segurança que informam sobre vulnerabilidades
encontradas e atualizações disponíveis.
Daremos dicas mais específicas quando abordarmos os softwares de criptografia
recomendados neste curso.
Resumo
------
* Chaves simétricas e assimétricas.
* Cifrar e decifrar mensagens: fornecem **confidencialidade**.
* Assinaturas digitais: fornecem **autenticidade** e **integridade**.
* Identificação de chaves com pessoas, entidades ou sistemas: fornecem **autenticidade**.
* A identificação feita por terceiros é chamada neste guia de **certificação**.
* Use apenas soluções de criptografia forte que sejam consagradas pela comunidade de segurança.
Atividades
----------
1. Você conseguiria dizer quais meios de comunicação que você utiliza
que estão com criptografia disponível e ativada? Você conseguiria
classificar a qualidade da criptografia? Faça uma pesquisa rápida!
Referências
-----------
* `Abre-te Sésamo: as senhas da nossa vida digital | Oficina Antivigilância `_.
* `Response to XKCD - Passwords `_.