Intro à criptografia: simétrica vs. assimétrica, RSA, e o porquê de números primos serem importantes [SEGURANÇA DA INFORMAÇÃO]
Fala, pessoal, tudo bem? Hoje vamos entender a diferença entre criptografia simétrica e assimétrica, entender criptografia RSA, que é o sistema assimétrico mais famoso hoje em dia, e ao fim, vamos entender a importância de números primos. Creio que o público-alvo já deve ter pelo menos uma noção do que é criptografia e para o que serve, então não vou me ater a esses floreios, vamos direto para o que importa aqui.
Vou começar explicando a cifra de César, um sistema criptográfico muito simples. Assim como o 'Hello, world!' está para a programação, a cifra de César está para a área de criptografia, então nós vamos usá-lo apenas como um pretexto para explicar simetria, e depois assimetria.
Cifra de César
A cifra de César é um tipo de criptografia de substituição, que consiste basicamente em uma troca de letras como vemos abaixo:
| a | b | c | d | e | f | g | h | i | j | k | l | m |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| d | e | f | g | h | i | j | k | l | m | n | o | p |
| n | o | p | q | r | s | t | u | v | w | x | y | z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| q | r | s | t | u | v | w | x | y | z | a | b | c |
Analisando a tabela, você consegue deduzir como a encriptação é feita?
Exatamente, a encriptação será simplesmente pegar a letra que deseja criptografar e ver qual é a 3º letra à sua frente:
(se não há mais letras à frente, voltamos para o início do alfabeto)
E a decriptação será o processo inverso da encriptação: pegar a letra criptografada e ver qual é a 3º letra que a precede.
A cifra de César é um tipo muito fraco de criptografia. Por exemplo, se fizermos uma criptoanálise de frequência de letras, nós conseguimos inferir qual letra encriptada corresponde à original, e logo conseguimos pegar o esquema.
Porém há outro fator além deste que pode torná-la insegura para envio de dados, que é o fato de ser simétrica. Abaixo vamos entender o que significa ser simétrica, e porque isso pode ser um problema dependendo do contexto.
Criptografia simétrica vs. assimétrica
Na cifra de César, tanto o emissor quanto o receptor precisam simultaneamente ter ciência de quantas posições devem se deslocar no alfabeto para encriptar/decriptar a informação. Este segredo de quantas posições deslocar, nós vamos chamar de chave (há controvérsias se o tamanho do deslocamento na cifra de César é uma chave, pois é intrínseco no método que o deslocamento é sempre 3, mas para a explicação, vamos considerar o tamanho do deslocamento como uma chave).
Note que ambos os envolvidos na comunicação precisam ter em posse a mesma chave para estabelecer uma comunicação. Note também que esta chave serve tanto para encriptar quanto para decriptar uma mensagem. Então mesmo que por ventura uma parte deseje só criptografar para enviar à outra parte, ela ainda assim precisará de uma chave que desempenha as duas funções.
Quando ambos os envolvidos na comunicação são capazes de criptografar e descriptografar usando a mesma chave para isto, nós chamamos a chave de chave única, e dizemos que a criptografia é simétrica. A chave é única justamente porque ela é usada tanto na hora de criptografar quanto na hora de descriptografar.
Você pode levantar o seguinte questionamento: "E se dissermos ao receptor somente a informação que ele precisa para descriptografar, que é regredir 3 posições para achar a letra original? Assim não falaríamos a ele qual é a regra de encriptação."
Pois, bem, note que anteriormente eu coloquei "encriptar/decriptar" junto, pois no fim das contas, a regra de ambas as funções é a mesma coisa, já que sabendo uma delas, conseguimos chegar imediatamente na outra:
- Se para descriptografar, eu preciso regredir 3 posições, é lógico que para criptografar, eu preciso progredir 3 posições.
- Se para criptografar, eu preciso progredir 3 posições, é lógico que para descriptografar, eu preciso regredir 3 posições.
- Logo, eu descriptografo regredindo 3 posições se, e somente se, eu criptografo progredindo 3 posições.
Em alguns casos em que os canais de comunicação são poucos, e temos garantia que são confiáveis, pode ser interessante usar uma criptografia simétrica, considerando também que elas são bem mais rápidas na hora de serem geradas quando comparadas com as assimétricas. Porém na grande maioria dos casos é um problema usar chaves únicas.
Imagine um banco que possui vários clientes, e sempre que esses clientes precisam fazer uma transferência bancária, eles precisam enviar informações sigilosas pela rede. Seria insustentável uma criptografia simétrica nesse caso, pois se um monte de pessoas tem uma chave que encripta/decripta, basta uma pessoa maliciosa interceptar uma mensagem criptografada, e usar a própria chave dada a ele pelo banco para descriptografá-la.
Como o banco pode consertar esta falha?
Se o banco quiser continuar insistindo em chaves únicas, há várias maneiras de dificultar o trabalho do hacker, como por exemplo, criar chaves diferentes para cada usuário. Porém estas maneiras seriam muito mais uma solução paliativa do que uma solução de fato. Devemos considerar também que os métodos de criptografia simétrica hoje em dia são razoavelmente fáceis de serem burlados usando criptoanálise.
Já que os clientes apenas enviarão informações ao banco, a melhor opção então seria dar um jeito de delegar a eles somente a função de criptografar, e restringir ao banco a função de descriptografar os dados, concorda?
Pois bem, é justamente essa a ideia de uma criptografia assimétrica: você criar uma assimetria na comunicação onde somente uma parte tem poder de decriptar, e a outra parte pode apenas encriptar os dados e enviar para a parte capaz de decriptar.
Logo ao invés de haver uma chave única capaz de encriptar/decriptar, na criptografia assimétrica há duas chaves:
- chave pública, que é capaz apenas de encriptar.
- chave privada, que é capaz apenas de decriptar.
Vamos agora entender como funciona um método assimétrico.
Criptografia RSA
Apesar de ser necessário um conhecimento matemático para entender a criptografia RSA, a maioria dos conhecimentos serão tranquilos e intuitivos, como por exemplo, saber o que é máximo divisor comum (MDC), números primos, função de Euler, etc. Caso você não conheça algum desses assuntos, eu vou me esforçar ao máximo para explicá-los conforme eles forem demandados durante a explicação.
Primeiro passo é escolhermos dois números primos e com no mínimo do mínimo 150 casas decimais e guardá-los em segredo. A segurança do método está intimamente ligada à magnitude dos números primos, por isso devemos escolher números muito grandes.
Números Primos
Números primos são números que são divisíveis somente por 1 e por ele mesmo.
Exemplo:
2 é primo, pois só é divisível por 1 e por 2 (ele mesmo).
7 é primo, pois só é divisível por 1 e por 7.
6 não é primo, pois é divisível por 1, por 2, por 3 e por 6.
Os primos também precisam estarem distantes um do outro. Caso eles estejam muito próximos, conseguimos descobri-los por meio de um método de tentativa e erro.
Após isso, vamos multiplicar e para criar um número que só é divísivel por e :
Agora devemos escolher um número natural tal que
Onde é a função de Euler. Ela também deve ser guardada em segredo.
Máximo Divisor Comum (MDC)
Como o próprio nome já diz, o de dois números inteiros é o maior divisor capaz de dividir ambos simultaneamente.
Exemplo:
Logo , já que o fator máximo que ambos compartilham é .Outro exemplo:
660 =
Logo , já que ambos têm simultaneamente e como fatores.
Função de Euler
nos informa a quantidade de números inteiros positivos , tal que , isto é, tal que e são primos relativos entre si.
Exemplo:
, pois há 4 números menores ou iguais a que são primos relativos a 12:
✔
✘
✘
✘
✔
✘
✔
✘
✘
✘
✔
✘Não precisamos testar um por um, há uma fórmula para calcular de forma analítica:
- Decompor em seus fatores primos.
- Calcular para cada primo usando a fórmula
- Multiplicar todos os
logo
Encriptação
A chave pública consistirá de:
- o número
- o número
A chave pública será usada por quem quiser. Vamos ver a seguir como usar a chave pública para criptografar um bloco de dados.
Primeiro devemos pegar um bloco onde é um número entre e :
Caso contrário, a encriptação não dará certa. Lembrando que qualquer informação pode ser representada como um número inteiro em um computador.
resto da divisão de por
Alguns detalhes importantes:
Se =
Como é igual ao resto da divisão de por ,
E como , o resto de por é igual
Logo , o que significa que não criptografamos
Em termos de pseudocódigo, poderíamos expressar da seguinte forma:
bloco_cript = exponencial_modular(base = b, expoente = e, mod = n)
Decriptação
A chave privada consistirá de:
- o número
- um inverso positivo de módulo . Chamaremos este número de " "
é usada tanto na chave pública quanto na privada, então ela é uma informação pública. Já deve ser guardada em segredo. E por isso a importância de guardar em segredo também, pois se não fosse, poderíamos usá-la em conjunto com , que é uma informação pública, para descobrir . Sem contar que a partir de apenas , nós conseguimos usar um método para descobrir os números primos e escolhidos.
Inverso de um número módulo
O inverso de um número inteiro módulo é o número inteiro que multiplicado por fica congruente a módulo , isto é, o resultado da multiplicação entre e deixa resto na divisão por :
Um número só tem inverso módulo se, e somente se, (isto é, se e forem primos relativos entre si)
Exemplo:
, então existe inverso
Usando algoritmo de Euclides para descobrir :
Logo é o inverso de módulo
então é um número positivo que quando multiplicado por , o resultado dessa multiplicação é congruente a módulo :
A chave privada será usada somente por nós. Vamos ver a seguir como usar a chave privada para descriptografar um bloco de dados criptografados.
Vamos pegar um bloco criptografado, isto é, pegar , e aplicar a decriptação.
= resto da divisão de por
Prova
Se resto da divisão de por
Isto significa que
Se = resto da divisão de por
Isto significa que
A notação " " significa "congruente a".
Um número é congruente a módulo se, e somente se, eles deixam o mesmo resto de divisão quando divididos por .Exemplo:
é congruente a módulo , pois o resto da divisão por de ambos vale .
Como
**Não confunda: é congruente a , ele NÃO É igual a
implica em
Se , então e deixam o mesmo resto em uma divisão por :
Sendo assim
Logo
(este " " é um número inteiro que multiplicado por , resulta em )
Sabemos que , logo
Sabemos também que
Então
Agora basta nós analisarmos algumas situações para simplificarmos a expressão acima:
Sobre os símbolos que aparecerão abaixo:
- " " significa “divide”
- " " significa "não divide"
- Se :
-
Pelo pequeno teorema de Fermat, temos que
EntãoTeorema de Fermat: se é um número primo e , então .
-
- Se
-
Sejam e números inteiros. Se , então
Se e
Entao
-
Analogamente, o mesmo vale para o primo :
Pelas expressões modulares, sabemos que:
- , portanto
- , portanto
Já que e dividem , e - pois são dois números primos -, nós podemos afirmar que:
Como e
= resto da divisão de por
Em termos de pseudocódigo, poderíamos expressar da seguinte forma:
bloco_decript = exponencial_modular(base = bloco_cript, expoente = d, mod = n)
Agora vocês conseguem compreender a importância dos números primos? Toda a criptografia RSA está baseada no fato de não ser possível encontrar os divisores de um número de maneira analítica. A única forma é por meio da tentativa e erro.
Então apesar de ser um número conhecido por qualquer um, a única forma de descobrir seus divisores e , é tentando dividi-lo por uma quantidade avassaladora de possibilidades.
Porém, se por um acaso conseguirmos descobrir um divisor de automaticamente temos o outro divisor então tendo os dois divisores de , isto é, os primos e , conseguimos calcular tendo , conseguimos calcular e tendo , conseguimos decriptar o número.
Vamos agora a um exemplo prático:
**Visando praticidade, nós vamos usar apenas números de pequena magnitude
Escolhendo os primos:
e
Calculando :
Calculando :
Escolhendo tal que :
Você pode conferir que de fato
Calculando :
Usando algoritmo de Euclides para descobrir :
(Se não entendeu este passo, não se preocupe)
| 11 | 13 | 143 | 120 | 7 | 103 |
Aplicando a criptografia em um bloco de dados qualquer
resto da divisão de por :
Aplicando a descriptografia no bloco criptografado
resto da divisão de por :

Isso é tudo, pessoal! Obrigado a todos que leram até aqui. Espero ter sido claro em minhas explicações.
Os conceitos matemáticos que usei aqui, como módulo, algoritmo de Euclides, etc, são vistos em uma disciplina chamada "Teoria dos Números". Caso queira se aprofundar, recomendo o livro do IMPA: Teoria dos Números - um passeio com primos e outros números familiares pelo mundo inteiro
Caso tenha gostado deste material, considere dar uma lida neste meu outro post também: Como um computador soma números? Clique aqui e entenda! [CIRCUITOS DIGITAIS].