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.