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

Exponenciação Modular Randomizada: Como Blindar RSA Contra Ataques de Canal Lateral

Um smart card, um token de autenticação, um chip de secure boot — qualquer dispositivo que alguém consiga colocar as mãos fisicamente em cima é candidato a um ataque de canal lateral. Não é ficção: já apareceu documentado em produto comercial real. O atacante nem precisa quebrar a matemática do RSA; basta medir tempo de execução ou consumo de energia enquanto o dispositivo faz a conta, e reconstruir bit a bit o expoente secreto.

O motivo é conhecido: no algoritmo clássico de square-and-multiply, a multiplicação só acontece quando o bit do expoente é 1. Essa diferença de trabalho vaza. Se você já leu sobre essa vulnerabilidade em “Exponenciação Modular Rápida e Segura: Square-and-Multiply na Prática”, este artigo é sobre uma das respostas mais elegantes ao problema: randomizar a própria conta, sem mudar o resultado final.

A ideia central

Exponenciação modular randomizada não muda o algoritmo de multiplicação em si — muda os parâmetros que entram nele. Em vez de operar diretamente sobre x, d e N (base, expoente secreto e módulo), o algoritmo gera três números aleatórios e transforma os parâmetros antes de fazer a conta. O padrão de bits que um atacante observaria durante a execução deixa de corresponder ao expoente real, porque o expoente real nunca é usado diretamente.

O algoritmo, passo a passo

1. Escolha de números aleatórios

Três valores aleatórios são sorteados: r₁, r₂ e r₃. Eles servem para modificar os parâmetros originais da computação.

2. Transformação dos parâmetros

Usando esses números, os valores originais x, d e N são transformados em novos parâmetros:

  • x′ = x + r₁ · N
  • d′ = d + r₂ · φ(N)
  • N′ = r₃ · N

Aqui, φ(N) é a função totiente de Euler — quantos números até N são relativamente primos a N.

3. Cálculo da exponenciação

Em vez de calcular xd mod N diretamente, o algoritmo calcula x′d′ mod N′. Depois disso, o resultado é reduzido módulo N para recuperar o valor final.

4. Resultado final

O valor obtido, mesmo depois das modificações e do uso de números aleatórios, é igual a xd mod N. O processo intermediário, no entanto, impede que o expoente secreto d seja revelado pela análise das operações — porque o expoente que efetivamente “aparece” na execução é d′, diferente a cada rodada.

Por que isso funciona: Euler entra em cena

A segurança do método randomizado depende diretamente de dois conceitos de teoria dos números.

Função totiente de Euler (φ)

φ(N) é o número de inteiros positivos até N que são relativamente primos a N. Alguns exemplos:

  • φ(2) = 1
  • φ(3) = 2
  • φ(5) = 4
  • φ(10) = 4 (só 1, 3, 7 e 9 são relativamente primos a 10)

Além disso, para dois números m e n relativamente primos entre si, vale φ(m·n) = φ(m)·φ(n) — propriedade que simplifica bastante os cálculos envolvidos.

Teorema de Euler

O Teorema de Euler diz que, para qualquer inteiro a relativamente primo a n:

aφ(n) mod n = 1

Essa relação é o que garante que, depois de toda a transformação dos parâmetros com números aleatórios, a redução final módulo N devolve exatamente o valor correto — sem essa garantia matemática, a randomização quebraria o resultado em vez de só disfarçar o processo.

O que você ganha — e o que isso custa

Ganhos:

  • Obscurecimento do expoente secreto: a aleatoriedade incorporada ao processo impede que o padrão de multiplicações e quadrados revele bits de d, neutralizando o vetor de ataque por canal lateral.
  • Correção computacional preservada: apesar das modificações, o Teorema de Euler garante que o resultado final continua equivalente ao cálculo original xd mod N.
  • Camada extra de segurança: a técnica reforça a robustez do sistema contra técnicas de ataque cada vez mais sofisticadas.

O que isso custa, e ninguém deveria fingir que não custa: gerar três números aleatórios de qualidade criptográfica a cada operação não é grátis, e os parâmetros transformados (x′, d′, N′) são maiores que os originais — o que significa mais bits para processar em cada multiplicação. Randomização é uma troca deliberada de performance por resistência a canal lateral, não um upgrade “de graça”. Se seu dispositivo já está no limite de processamento (um microcontrolador simples, por exemplo), vale medir esse overhead antes de assumir que a técnica cabe no orçamento do projeto.

Vale notar também que essa técnica resolve um problema diferente do que a Redução de Montgomery resolve — Montgomery ataca o custo da multiplicação modular em si (ver “Redução de Montgomery: Otimizando a Multiplicação Modular em Hardware”), enquanto randomização ataca especificamente o vazamento de informação através do padrão observável de execução. Na prática, é comum ver as duas combinadas na mesma implementação, cada uma resolvendo a sua parte do problema.

Fechando

Exponenciação modular randomizada é a evolução natural do square-and-multiply clássico quando você para de tratar side-channel como “problema de outro departamento”. Integrando aleatoriedade a fundamentos matemáticos sólidos — o Teorema de Euler não é coadjuvante aqui, é o que garante que a técnica não quebre o resultado — ela neutraliza justamente a vulnerabilidade que a versão otimizada e “rápida” do algoritmo introduziu.

Se você trabalha com hardware que processa chaves privadas fisicamente acessíveis a terceiros — cartão, token, qualquer secure element — essa é uma das primeiras defesas que vale avaliar, ao lado de Montgomery Ladder e blinding de base. Comenta aqui se você já mediu o overhead de uma implementação randomizada em produção: quanto isso pesou no seu caso?

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