Criptografia 101 (Anexo): RSA Explicado
Este é parte de uma série maior de artigos sobre criptografia. Se este é o primeiro artigo que você encontra, recomendo fortemente começar pelo início da série.
A encriptação RSA é um dos algoritmos de encriptação mais amplamente utilizados — e ele se baseia exclusivamente no grupo aditivo dos inteiros módulo . É um ótimo exemplo de quanto pode ser feito sem a necessidade de curvas elípticas ou qualquer outra construção mais complexa.
Este artigo anexo é dedicado a explicar os princípios de funcionamento e nuances do algoritmo RSA.
O Problema Subjacente
Muitos mecanismos criptográficos operam com base no princípio de que é realmente difícil realizar uma certa operação a menos que você conheça alguma chave secreta. Na encriptação, essa é exatamente a ideia: uma mensagem encriptada é indecifrável sem o conhecimento da referida chave secreta.
Como isso é alcançado, então? Criando um problema que é realmente difícil de resolver, a menos que você tenha alguma informação secreta adicional. O RSA depende de um desses problemas: a fatoração de números grandes em seus fatores primos. Isso é: dado um número (grande) , expressá-lo como:
Onde e são números primos grandes. Se você conhece e , calcular é trivial — e o mesmo vale para calcular se você conhece e .
Quão Grande é Grande o Suficiente?
Claro, tudo isso é inútil se o problema for fácil de resolver. Por exemplo, se , então a fatoração realmente leva apenas um instante. No entanto, à medida que os números primos se tornam maiores, a fatoração começa a levar cada vez mais tempo.
O tamanho recomendado para os fatores primos e está entre e bits. Para referência, veja como um número primo de 1024 bits se vê:
170154366828665079503315635359566390626153860097410117673698414542663355444709893966571750073322692712277666971313348160841835991041384679700511912064982526249529596585220499141442747333138443745082395711957231040341599508490720584345044145678716964326909852653412051765274781142172235546768485104821112642811
Sim, é bem grande.
Estimar quanto tempo levaria para encontrar os fatores primos de um número grande, digamos, com 2048 bits, é difícil. Principalmente porque isso realmente não foi jamais feito!
Mas ainda assim, teoriza-se que levaria de centenas a milhares de anos, mesmo com hardware poderoso. A menos que a Computação Quântica se torne disponível — e essa é uma história para outro momento.
Preliminares
Como usamos o problema anterior para encriptar dados? Fazer isso exigirá algumas definições. Em particular, precisaremos conhecer a função totiente de Euler e suas propriedades.
Função Totiente de Euler
Para qualquer número natural , esta função (denotada como ) conta quantos números naturais menores que (sem contar 0) são coprimos com ele.
Ser coprimo significa que os números não compartilham fatores primos. Outra maneira de dizer isso é que o máximo divisor comum de números coprimos é .
Por exemplo, e são coprimos.
Observe que para um número primo , cada número menor que ele é coprimo (porque como é primo, seu único fator primo é !). Então podemos escrever:
E também, é verdade que para , se e são primos, então:
Uma Propriedade Importante
Por que nos importamos com a função totiente? Principalmente por causa do teorema de Euler, que estabelece que se e são coprimos, então:
E se multiplicarmos ambos os lados por , isso é o que obtemos:
Aparentemente, existe um certo número mágico que parece nos permitir recuperar o valor original !

O Algoritmo
Se substituirmos na equação anterior por nossa mensagem , então temos uma ótima base para um mecanismo de encriptação, porque temos uma operação em que nos permite recuperar !
O que precisamos fazer é dividir o processo em dois passos. E para fazer isso, simplesmente fatoramos .
Esta não é sua fatoração usual, entretanto. O que realmente acontece é que escolhemos algum número aleatório grande , desde que , e que seja coprimo com . Então, calculamos outro número tal que:
Isso é realmente apenas o inverso multiplicativo modular de , módulo .
E calcular dessa maneira garante que o seguinte seja verdadeiro (o que é bastante simples de provar, então deixo essa tarefa para você):
E a parte interessante é que, com o conhecimento de e , não é fácil calcular porque para isso, você precisaria dos fatores primos de ! O que é um problema realmente difícil! Por esse motivo, pode ser tornado público — e de fato será a chave pública no RSA.
Os Passos
Tudo o que resta é separar em dois passos. Usamos a chave pública para calcular um texto cifrado:
Sem o conhecimento de , isso não pode ser convertido de volta em . Então, desde que seja mantido em segredo, apenas quem detém esse valor pode decriptar . E por causa disso, será nossa chave privada.
Para decriptar, simplesmente fazemos o seguinte:
E voilà! A mensagem está decriptada!
Note que você também pode assinar digitalmente com este esquema, usando para produzir uma assinatura, e para verificá-la. Legal, né?
Resumo
E aí está! É assim que a encriptação RSA funciona.

Não há muito mais a dizer sobre isso. Ainda assim, há alguns pontos que não abordamos — nomeadamente, como calcular inversos multiplicativos modulares, ou como gerar grandes números primos. Não vamos cobri-los aqui, mas, é claro, esses também são componentes-chave para a encriptação RSA.
No entanto, existem alguns pontos particularmente sensíveis no RSA que podem se tornar grandes armadilhas para todo o sistema criptográfico, como é fantasticamente explicado aqui. A teoria é realmente boa e bonita, mas implementar esse esquema aparentemente simples por conta própria pode torná-lo muito vulnerável.

Esta é uma das razões pelas quais o RSA é considerado principalmente obsoleto, e tem sido substituído pela Criptografia de Curva Elíptica (ECC) para muitas aplicações.