📬 Toda semana, um resumo de segurança, Clean Code e IA no seu e-mail Inscreva-se →

Exponenciação Modular: Fundamentos, Aplicações e Desafios de Segurança em Hardware

Teve um projeto, lá atrás, em que eu precisava validar se o coprocessador criptográfico de um SoC embarcado realmente fazia o que a folha de dados prometia. Não bastava saber que ali dentro “rodava RSA”. Eu precisava entender a conta que a Unidade estava executando — porque se não entendesse, não tinha como saber se um resultado errado era bug de integração ou o próprio coprocessador falhando. Foi aí que fui parar de novo, de caneta e papel, em exponenciação modular.

Se você trabalha com segurança — de software, embarcados ou hardware — provavelmente já esbarrou nesse nome sem parar muito para entender o que está por trás. Este artigo é o ponto de partida: o que é, para que serve, como se implementa na prática, e onde a implementação pode te trair.

O que é exponenciação modular

A operação é simples de descrever: elevar um número a uma potência e pegar o resto da divisão por outro número.

ae mod n

Um exemplo pequeno, só para fixar: 2¹⁰ mod 10.

  1. 2¹⁰ = 1024
  2. 1024 mod 10 = 4

Com números desse tamanho, qualquer calculadora resolve. O problema aparece quando base, expoente e módulo passam a ter centenas ou milhares de bits — que é exatamente o tamanho usado em criptografia de verdade. Nesse regime, “calcular a potência e depois tirar o módulo” deixa de ser uma opção, porque o número intermediário explode antes de você conseguir aplicar o módulo.

Por que isso importa

Fora o interesse teórico em teoria dos números, exponenciação modular é o motor de dois pilares da criptografia de chave pública:

  • Troca de chaves Diffie-Hellman, que permite duas partes combinarem uma chave secreta compartilhada num canal que ninguém garante que seja seguro.
  • RSA, que usa a mesma operação tanto para cifrar quanto para decifrar mensagens, com chaves diferentes de cada lado.

Nos dois casos, dá para inverter a lógica: fácil calcular ae mod n quando você sabe os valores, difícil (computacionalmente inviável) descobrir o expoente secreto só observando o resultado. É essa assimetria que sustenta a segurança do esquema todo.

Não vou repetir aqui o passo a passo completo de Diffie-Hellman e RSA — isso já está detalhado, com conta numérica de verdade, em “Criptografia Moderna na Prática: RSA e Diffie-Hellman com Exponenciação Modular”. A ideia deste artigo é te dar o mapa geral antes de entrar nos detalhes de cada peça.

Como implementar isso sem seu processador pegar fogo

Existem, na prática, três níveis de sofisticação:

1. Abordagem direta (não faça isso): calcular a potência inteira primeiro, aplicar o módulo depois. Funciona no papel, é inviável no mundo real — o número intermediário cresce exponencialmente antes de você conseguir reduzi-lo.

2. Abordagem iterativa: aplicar o módulo a cada multiplicação, mantendo os números sempre dentro de uma faixa controlada. Já resolve o problema de estouro, mas ainda exige uma multiplicação por unidade do expoente — inviável para expoentes de centenas de bits.

3. Square-and-multiply: converte o expoente para binário e reduz a complexidade de O(e) para O(log e) multiplicações. Para calcular a²³, por exemplo, a abordagem ingênua pediria 22 multiplicações; square-and-multiply resolve com 7. Esse ganho é o motivo pelo qual toda implementação séria de RSA e Diffie-Hellman usa alguma variante dessa técnica.

Eu dedico um artigo inteiro só à mecânica de square-and-multiply — com código, tabela passo a passo e as duas variações (esquerda-para-direita e direita-para-esquerda) — em “Exponenciação Modular Rápida e Segura: Square-and-Multiply na Prática”. Vale a leitura se você for implementar isso na mão.

O problema que ninguém te conta na faculdade: hardware vazando informação

Aqui está o ponto que faz esse tema pertencer à categoria de Hardware Security, e não só de matemática aplicada: uma implementação matematicamente correta pode ainda assim ser insegura.

O motivo é físico, não matemático. No square-and-multiply, a operação de multiplicação só acontece quando o bit correspondente do expoente é 1. Isso significa que, dependendo do bit, o hardware faz mais ou menos trabalho — e esse “mais ou menos trabalho” se manifesta em tempo de execução, consumo de energia e até radiação eletromagnética. Um atacante com acesso físico (ou próximo o suficiente) ao dispositivo pode medir essas variações e, com paciência, reconstruir os bits do expoente secreto. Isso é um ataque de canal lateral (side-channel attack), e ele não explora nenhuma falha matemática do RSA — explora a implementação.

Isso já derrubou chips comerciais reais. Não é hipótese acadêmica.

O que dá para fazer a respeito

  • Implementações de tempo constante: eliminar desvios de execução que dependem do valor dos bits do expoente.
  • Masking e blinding: técnicas que embaralham a relação entre o dado processado e o consumo de energia/tempo observável, dificultando a correlação estatística que o atacante precisa fazer.
  • Revisão de segurança desde o design do hardware: a otimização de performance não pode ser a última palavra — segurança física precisa entrar na equação antes do silício ser desenhado, não depois que o produto já foi lançado.

Duas técnicas específicas merecem artigo próprio porque resolvem esse problema de formas bem diferentes:

  • Redução de Montgomery, que ataca o problema pelo lado da eficiência (elimina divisões caras, mas isso por si só já reduz a superfície de variação temporal) — ver “Redução de Montgomery: Otimizando a Multiplicação Modular em Hardware”.
  • Exponenciação modular randomizada, que ataca o problema de frente, embaralhando os próprios parâmetros da conta com números aleatórios e se apoiando no Teorema de Euler para garantir que o resultado final continue correto — ver “Exponenciação Modular Randomizada: Como Blindar RSA Contra Ataques de Canal Lateral”.

Fechando

Exponenciação modular é simples de descrever e traiçoeira de implementar direito. A parte matemática você resolve numa tarde estudando; a parte de hardware — onde tempo, energia e corrente viram vazamento de informação — é onde a maioria dos projetos comerciais tropeça, porque exige pensar em segurança e performance ao mesmo tempo, não uma depois da outra.

Se você está entrando nesse assunto agora, comece por aqui, depois siga para o artigo sobre RSA/Diffie-Hellman na prática, e só então mergulhe nas técnicas de otimização e blindagem contra canal lateral. Se você já mexe com isso no dia a dia, me conta nos comentários: já pegou algum caso real de side-channel em projeto seu, ou isso ainda é teoria pra você?

Leandro Rosendo Candido

Leandro Rosendo Candido

Engenheiro de Computação, mestre pela USP, 10+ anos com Embedded Linux. Escreve e grava sobre segurança, Clean Code e IA aplicada à programação.

Rolar para cima