baixar - Nilson José Machado

Propaganda
1
Universidade de São Paulo/Faculdade de Educação
Seminários de Ensino de Matemática (SEMA-FEUSP)
Coordenador: Nílson José Machado
novembro/2008
Números primos e Criptografia
Marisa Ortegoza da Cunha
[email protected]
A necessidade de buscar sigilo no envio e recebimento de informações é muito
antiga, remontando a centenas de anos. A idéia, aqui, é apresentar uma estratégia de
codificação de mensagens que se utiliza de números primos MUITO grandes, e que só se
tornou exeqüível com o surgimento do processamento eletrônico (durante a segunda guerra
mundial, vários artefatos mecânicos foram projetados com a finalidade de codificar as
mensagens enviadas).
O termo criptografia deriva da fusão das palavras gregas kryptós (oculto) e
gráphein (escrever). A chamada criptografia de chave pública tem esse nome porque uma
das chaves (há duas chaves: uma pública e outra, privada) do código a ser aplicado à
mensagem é acessível a estranhos e, mesmo assim, o sigilo da mensagem é preservado.
Tratamos aqui de cifragem por computador. Computadores manipulam apenas
números binários, isto é, seqüências de 0 e 1. O primeiro passo, então, é transformar a
mensagem em um número desse tipo. O método mais usual é adotar o código ASCII
(American Standard Code for Information Interchange – Código padrão americano para
troca de informações), que representa cada caracter a ser codificado por uma seqüência de 7
bits. Por exemplo, a letra L (maiúscula) é representada pela seqüência 1001100.
Interpretada corretamente, como sendo um número escrito na base 2, podemos “traduzi-lo”
para a base 10, por meio do seguinte cálculo:
(1001100)2 = 1x26 + 0x25 + 0x24 + 1x23 + 1x22 + 0x2 + 0 = 64 + 8 + 4 = 72, isto é, a letra
“L” é cifrada como sendo 72.
Por transformar um número (o texto original) em outro número (o texto cifrado),
podemos pensar que toda codificação realizada por computador é uma função matemática.
O problema é que uma mensagem deve ter sua codificação facilitada e sua decodificação
muito dificultada!! Assim, a função codificadora deve ser de difícil (se não impossível)
inversão. Queremos uma função “de mão única”.
Uma fonte de funções desse tipo é a chamada aritmética modular (ou aritmética
do relógio) - Considere os algarismos 0, 1, ..., n, dispostos em círculo, como os números no
mostrador de um relógio. Por exemplo, a figura abaixo mostra um relógio para aritmética
modular para n = 7 (diremos: aritmética módulo 7 e representaremos por (mod 7)):
2
Para calcular 3 + 2, começamos no 3 e avançamos duas casas, chegando ao 5, que é
a mesma resposta que obteríamos na aritmética normal, Mas se quisermos calcular 5+3,
começamos no 5 e avançamos 3 casas, chegando no 1, resultado bem diferente do fornecido
pela aritmética normal.
Escrevemos:
3 + 2 = 5 (mod 7)
5+3 = 1 (mod 7)
Na prática, o resultado de uma operação realizada (mod 7) é o RESTO da divisão do
resultado obtido na aritmética normal, por 7.
Por exemplo, 10 (mod 7 ) = 3. Neste caso, também podemos escrever na forma:
10 3 (mod 7) e ler “10 é congruente a 3 módulo 7”.
Pensemos, agora, na função x
3x.
Se x = 4, rapidamente calculamos 34 = 81.
O inverso também é simples: se sabemos que 3x = 243, podemos, por tentativas,
chegar ao resultado correto: x = 4.
Vejamos, contudo, como essa função se comporta na aritmética modular:
34 (mod 7) = 81 (mod 7) = 4
Até aqui, tudo bem. Só tivemos que dividir 81 por 7 e usar o resto. Mas e se
sabemos que 3x = 1(mod 7), o que fazer? A única saída segura é construir a tabela para
todos os valores possíveis de x:
x:
0
1
2
3
4
5
6
3x:
1
3
9
27
81
243 729
3x(mod 7):
1
3
2
6
4
5
1
E vemos, então, que o valor procurado para x é 1.
É fácil, agora, imaginar, a dificuldade que teríamos para resolver uma equação
como: 453x (mod 21.997) = 5.787
O método RSA
O nome deste criptossistema é uma homenagem a seus inventores: Ronald Rivest,
Adi Shamir e Leonard Adleman, pesquisadores do MIT (Massachusetts Institute of
Technology). O método se baseia nas seguintes relações:
Função de Eüler: Se n = pq, onde p e q são números primos distintos, então
(n) = (p-1)(q-1). A função (n) é o número de inteiros de 1 a n relativamente
primos com n.
3
Exemplo: se p = 3 e q = 5 então n = pq = 15 e (15) = 2x4 = 8 (De fato, há 8
números inteiros de 1 a 15 relativamente primos com 15: 1, 2, 4, 7, 8, 11, 13, 14).
Teorema de Eüler:
“Se n e a são inteiros relativamente primos, com n >0, então a (n) 1 (mod n).”
Exemplo: sejam n = 10 e a = 3. Então podemos escrever 10 = 2 x 5 e
(10) = (2-1)(5-1) = 4 e a (n) = 34 = 81 e 81 (mod 10) = 1, isto é, 81 1 (mod 10).
Problema: Alice quer enviar uma mensagem a Bob, sem que Eva, que pode interceptar a
mensagem, consiga compreender seu conteúdo.
O método RSA prevê os seguintes passos:
1. Bob escolhe dois números primos muito grandes, p e q.
2. Bob calcula n = pq.
3. Bob calcula (n) = (p-1)(q-1).
4. Bob escolhe um número aleatório m relativamente primo a (n).
5. Bob calcula o número d tal que m . d (mod (n)) = 1.
(Para isso, Bob pode usar de tentativas ou usar o algoritmo de Euclides.)
6. Bob transmite os números n e m para Alice, mantendo d em segredo).
(Note que para conhecer d, é preciso conhecer (n), o que fica difícil quando não se
sabe quais são os primos p e q).
7. Alice converte sua mensagem num número M e calcula N Mm (mod n).
8. Alice envia N para Bob.
9. Bob calcula M Nd (mod n) = (Mm)d = Mmd (mod n) e lê a mensagem.
Na prática, os números primos escolhidos são muito grandes, pois toda a segurança
que a criptografia RSA oferece depende da dificuldade de se fatorar o produto pq!!
Apenas como exemplo, vamos escolher números primos pequenos.
Exemplo.
1. Bob escolhe p = 17 e q = 11.
2. Bob calcula n = pq = 17x11 = 187
3. Bob calcula (187) = 16x10 = 160
4. Bob escolhe um número m, primo com 160; por exemplo, m = 7.
5. Bob tem que encontrar um número d tal que 7d (mod 160) = 1.
Por tentativas:
d = 1 7 (mod 160) = 7
d = 2 14 (mod 160) = 14
d = 3 21 (mod 160) = 21
d = 4 28 (mod 160) = 28
...
d = 23 161 (mod 160) = 1  encontrou! Então d = 23.
4
6. Bob manda n = 187 e m = 7 para Alice. (Somente Bob conhece o valor de d.)
7. Alice quer enviar um beijo para Bob, na forma da única letra X. No código ASCII, X é
representado por 1011000, que equivale a 88, em decimais. Assim, M = 88.
Alice calcula N Mm (mod n) = 887 (mod 187) =
= [882(mod 187) x 882(mod 187) x 882(mod 187) x 88(mod 187)] (mod 187) =
= [7744(mod 187) x 7744(mod 187) x 7744(mod 187) x 88] (mod 187) =
= (77 x 77 x 77 x 88) (mod 187) =
= 40.174.904 (mod 187) =
= 11
8.Alice envia N = 11 para Bob.
9. Bob calcula M Nd (mod n) = 1123(mod 187)
119(mod 187) = [113(mod 187) x 113(mod 187) x 113(mod 187)](mod 187) =
= (22 x 22 x 22)(mod 187) = 176
1118(mod 187) = [119(mod 187) x 119(mod 187)](mod 187) = (176 x 176)(mod 187)
= 121
115(mod 187) = 44
Então M = (121 x 44)(mod 187) = 5324(mod 187) = 88, que, sabemos, é a
codificação da letra X e a mensagem chegou ao seu destino.
Eva teve acesso às chaves públicas: n e m, assim como à mensagem N, criptografada. Ela
também poderia saber o que fazer para quebrar o código e ler a mensagem, mas faltou a
chave privada de Bob: o número d. E para conhecer d, Eva teria que conhecer p e q, ou
seja, teria que fatorar o número n – na dificuldade dessa fatoração é que reside toda a força
do método RSA.
Observação importante: Nosso exemplo lidou com uma mensagem de comprimento
mínimo e números primos pequenos. Mesmo assim os cálculos tomaram uns bons minutos
para serem feitos numa calculadora. Na prática, o método RSA é usado para criptografar
todos os nossos dados, numa transação via internet (como CPF, número de cartão de crédito
etc.), e os números primos escolhidos são da ordem de milhões de algarismos. Cálculos
possíveis apenas para computadores. Esses números primos monstruosos são guardados a
sete chaves pelas empresas ou órgão oficiais que oferecem segurança de redes de
transmissão. E são realizados esforços computacionais em torno do mundo todo em busca
de novos números primos, sempre e sempre maiores.
Em 1977, o matemático e escritor americano Martin Gardner fez um desafio para a
codificação de um texto cifrado por ele e forneceu para a chave o número:
n = 14.381.625.757.888.867.669.235.779.976.146.612.010.218.296.721.242.362.562.561.842.935.
706.935.245.733.897.830.597.123.563.958.705.058.989.075.147.599.290.026.879.543.541
Para decifrar o texto seria necessário encontrar os fatores primos desse número, o que só foi
possível dezessete anos mais tarde, pelo esforço conjunto de 600 pessoas de vários países,
utilizando computadores e supercomputadores espalhados pelo mundo.
5
Os fatores de n são:
p = 3.490.529.510.847.650.949.147.849.619.903.898.133.417.764.638.493.387.843.990.820.577
e
q = 32.769.132.993.266.709.549.961.988.190.834.461.413.177.642.967.992.942.539.798.288.533
O texto de Gardner, decifrado: “as palavras mágicas são estruturas sensíveis”.
O maior número primo conhecido até 06 de setembro de 2004 era 224.036.583 – 1, com
7.235.733 algarismos.
***** *****
Por que o método RSA funciona?
O número d (chave privada) é o elemento inverso de m, em Z* (n), conjunto formado pelos
números de 0 a (n)-1, que são relativamente primos com (n) . (Somente esses números
possuem um inverso, no conjunto).
Por exemplo, se n = 15 = 3 x 5, então (15) = 2 x 4 = 8.Z (15) = Z8 = {0,1,2,3,4,5,6,7}.
Quais desses elementos são inversíveis nesse conjunto?
Observem que somente aqueles que são relativamente primos com 8: 1, 3, 5 e 7 (neste
caso, cada um destes é o inverso de si mesmo).
Consideremos M relativamente primo com n.
Então, pelo teorema de Euler, M (n) = 1 (mod n).
Elevando os dois lados dessa igualdade a uma potência positiva k, temos:
Mk (n) = 1k (mod n) Mk (n) = 1 (mod n).
Multiplicando os dois lados por M: Mk (n)+1 = M (mod n).
Então, se md = k (n) + 1 (mod n), teremos Mmd = M (mod n), por isso, devemos ter
md = 1 (mod (n)).
Bibliografia
Burnett, Steve & Paine, Stephen. Criptografia e segurança – o guia oficial RSA. Rio de
Janeiro: Campus, 2002.
Scheinerman, Edward R., Matemática Discreta – uma introdução. São Paulo:
Thomson,2000.
Singh, Simon. O livro dos códigos. Rio de Janeiro: Record, 1999.
Download