Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Estadual de Campinas Instituto de Matemática, Estat́ıstica e Computação Cient́ıfica Departamento de Matemática Aplicada Dissertação de Mestrado TEORIA DOS NÚMEROS E O RSA por Bianca Amoras de Souza Mestrado em Matemática Aplicada Orientador: Prof. Dr. José Pĺınio de O. Santos Este trabalho contou com o apoio financeiro do CNPq. TEORIA DOS NÚMEROS E O RSA Este exemplar corresponde à redação final da dissertação intitulada “Teoria dos Números e o RSA” devidamente corrigida e defendida por Bianca Amoras de Souza e aprovada pela comissão julgadora. Campinas, 15 de agosto de 2004. Prof. Dr. José Pĺınio de O. Santos Orientador Banca Examinadora: 1. Prof. Dr. José Pĺınio de Oliveira Santos 2. Prof. Dr. Emerson Alexandre de Oliveira Lima 3. Profa. Dra. Sueli Rodrigues Costa Dissertação apresentada ao Instituto de Matemática, Estat́ıstica e Computação Ci- ent́ıfica, UNICAMP, como requisito par- cial para otenção do t́ıtulo de MESTRE em Matemática Aplicada. ii Campinas, 15 de julho de 2004. Autor: Bianca Amoras de Souza T́ıtulo: Teoria dos Números e o RSA Departamento: Matemática Aplicada Grau: Mestre em Matemática Aplicada Defesa: 06 de agosto de 2004 Assinatura da Autora iii Ao Sashenka. iv Sumário Abstract vii Resumo viii Agradecimentos ix Tabelas de Śımbolos xi Introdução 1 1 Criptografia Computacional 4 1.1 Sistemas Criptográficos . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 Funções Unidirecionais . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 Criptossistemas Simétricos e Assimétricos . . . . . . . . . . . . . . . 8 2 O Sistema de Chave Pública RSA 10 2.1 Geração das Chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2 Codificação e Decodificação . . . . . . . . . . . . . . . . . . . . . . . 13 2.3 Assinatura Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4 Segurança do RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 v 3 Testes de Primalidade 18 3.1 Distribuição de Primos . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.2 Teste de Solovay-Strassen . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3 Teste de Miller-Rabin . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.4 Teste de Agrawal-Kayal-Saxena . . . . . . . . . . . . . . . . . . . . . 33 3.4.1 Teoria dos Números . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4.2 Corpos finitos . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4.3 O algoritmo AKS . . . . . . . . . . . . . . . . . . . . . . . . . 43 4 Fatoração de Inteiros 53 4.1 Um Método Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.2 Método de Fermat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.3 ρ-Método de Pollard . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4 ρ− 1-Método de Pollard . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.5 Crivo Quadrático . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Conclusão 60 vi Abstract Number Theory has been subject of study since the ancient years. In the two last decades, this field of Mathematics has gained much interest due to its use in cryptography. The public-key cryptosystems have their security based on number theoretic problems which are computationally hard to solve. The RSA base its security on the difficulty in factoring numbers that are products of two big primes. In this work, we describe the RSA. As we are interested also in the generation of prime numbers and factorization of integers, we present some methods for primality testing and integer factorization. vii Resumo A Teoria dos Números tem sido objeto de estudo desde a antiguidade. Nas últimas duas décadas, este campo da Matemática tem ganho maior interesse devido à sua utilização em criptografia. Os criptossistemas de chave pública têm sua segurança baseada em problemas da Teoria dos Números que são computacionalmente dif́ıceis de resolver. O RSA baseia sua segurança na dificuldade de fatorar números que são produtos de dois primos grandes. Neste trabalho, descreveremos o RSA. Como estamos também interessados na geração de números primos e na fatoração de inteiros, apresentaremos alguns testes de primalidade e métodos de fatoração. viii Agradecimentos Agradeço a Deus, por tudo. Aos meus pais, Rosana e Francisco, sem os quais não estaria onde estou hoje. Em particular à minha mãe, quem esteve sempre ao meu lado. Ao Alexander Sosnovski (Sashenka) por seu amor, companheirismo e apoio. Ao Agnaldo Dantas Sobrinho, meu padrasto querido. Ao meu orientador, Prof. Pĺınio O. dos Santos, pela paciência, pela compreensão e por sua orientação neste trabalho. Aos meus amigos de todas as horas. Em especial, Ignêz G. Amaral e Luciane Bombach. Aos colegas do Departamento de Matemática Aplicada do IMECC por toda ajuda e companhia durante o curso. Em particular, agradeço aos colegas Eduardo Bovo, Igor Freire e Jair Cunha. Agradeço à Luziane por me ajudar a solucionar alguns problemas com relação ao LATEX. Aos professores dos Departamentos de Matemática e Matemática Aplicada por incentivarem meu gosto pelos estudos. ix Aos professores da banca examinadora, pelas sugestões e correções. Ao Alonso Sepúlveda Castellanos por me ajudar com a figura que representa um sistema criptográfico contida nesta dissertação. x Tabelas de Śımbolos bxc Maior inteiro menor do que ou igual a x lg x Número de bits de x f(x) = O(g(x)) Existência de uma constante positiva c e um inteiro n0 tais que f(x) ≤ cg(x) para x ≥ n0 log x Logaritmo natural de x logb x Logaritmo de x na base b φ(x) Número de inteiros menores do que ou iguais a x que são relativamente primos com x mdc(x, y) Máximo divisor comum dos inteiros x e y mmc(x, y) Mı́nimo múltiplo comum dos inteiros x e y π(x) Números de primos menores do que ou iguais a x( a n ) Śımbolo de Jacobi E(n) Conjunto de bases de Euler para os quais n é um candidato a primo |C| Cardinalidade do conjunto C Zn Grupo aditivo de inteiros módulo n Z∗n Grupo multiplicativo de inteiros módulo n ordna Ordem de a módulo n S(n) Conjunto de bases para os quais n é um candidato forte a primo (A : B) Índice do subgrupo B em A, A um grupo xi ( m n ) Coeficiente binomial de m e n P (n) Maior primo divisor de n π′(x) Cardinalidade de {p ; p é primo , p ≤ x e P (p− 1) > x2/3} Zn[x] Anel de polinômios em Zn p(x) mod (q(x), n) Resto da divisão do polinômio p(x) pelo polinômio q(x) em Zn[x] F Anel de polinômios em Zn[x] de grau ≤ grau(h(x)) onde a adição e a multiplicação são módulo h(x), h(x) um polinômio irredut́ıvel og Ordem de g(x) em F xii Introdução A palavra criptografia tem origem no grego, onde cryptos significa oculto, se- creto, escondido e grapho significa escrita, grafia. A criptografia é, então, o estudo de métodos para transformar uma mensagem originalmente compreenśıvel em algo incompreenśıvel para todos, exceto para o destinatário leǵıtimo da mensagem que a tornará leǵıvel novamente, podendo interpretar seu conteúdo. O processo de transformar uma mensagem leǵıvel em uma equivalente mas ileǵıvel é chamado de codificação. E o que um usuário leǵıtimo do código usa para tornar compreenśıvel uma mensagem codificada é denominado decodificação. Em geral, para decodificar uma mensagem é necessário o conhecimento de uma chave secreta dispońıvel ao usuário leǵıtimo do código. É posśıvel que pessoas não au- torizadas tenham acesso à mensagem codificada e consigam determinar seu conteúdo ou mesmo a chave de decodificação, “quebrando” o código. A este processo chama- mos de deciframento. A criptoanálise (cryptos+analysis= decomposição) busca determinar a chave de decodificação ou decifrar a mensagem sem o conhecimento da chave. Ao estudo ou ciência quereúne a criptografia e a criptoanálise chamamos de criptologia. 1 O uso da criptografia já se fazia presente no sistema eǵıpcio de escrita hierogĺıfica, há aproximadamente quatro mil anos. Júlio César usava um cifrário para comunicar seus planos de batalha aos generais de seu exército. Tal cifra consistia em transladar as letras do alfabeto três casas adiante. Existem outros códigos primitivos semelhantes a este como, por exemplo, o cifrário de Vigenère [18, §4 On the Origin of the Species] e o cifrário de Hill [18, §13 Secrecy for Sale]. A partir do advento dos computadores, os métodos de codificação baseados em substituição alfabética tornaram-se inviáveis. Na verdade, o primeiro computador foi criado para decifrar as mensagens secretas estabelecidas pelo exército alemão durante a Segunda Guerra Mundial. As mensagens alemães eram codificadas através de uma máquina chamada Enigma. Um projeto denominado ULTRA foi desenvolvido na época em Bletchley Park, Inglaterra, para tentar decifrar o código alemão. Um dos responsáveis por este projeto era Alan Turing, o idealizador da máquina de Turing. Como conseqüência deste projeto o primeiro computador foi constrúıdo, o Colossus. Até então, o uso da criptografia estava associada a interesses poĺıticos e militares. Com a crescente utilização de redes de computadores, a necessidade de se manter informações sigilosas também cresceu. A criptografia segue, então, uma nova direção, deixando de servir a interesses puramente militares ou poĺıticos e passa a servir a cidadãos comuns. Um exemplo disso, é a enorme quantidade de transações bancárias ou comerciais feitas através da internet nos dias de hoje. Particularmente, estaremos interessados na criptografia computacional, onde a segurança de informações em redes de computadores, em bancos de dados, em caixas automáticos, etc. é a principal preocupação. Mais especificamente, faremos uma relação entre a criptografia RSA e a Teoria dos Números. Atualmente, o RSA é um 2 dos métodos criptográficos mais usados em aplicações comerciais. Inicialmente, descreveremos o RSA. Como para codificar uma mensagem usando o RSA é preciso obter dois primos grandes, exporemos alguns algoritmos para testar a primalidade de números. Outro aspecto importante em relação ao RSA é a intrata- bilidade de se fatorar o produto de dois primos grandes, também serão apresentados alguns algoritmos de fatoração. Como em nosso estudo analisaremos a complexidade de alguns algoritmos impor- tantes direta ou indiretamente para a criptografia RSA, faremos as análises em termos do tamanho da entrada. Definição 0.0.1. Seja n um inteiro positivo. Definimos lg n = { 1, se n = 0 1 + blog2 nc, se n 6= 0 . Assim, lg n conta o número de bits na representação binária de um inteiro n. 3 Caṕıtulo 1 Criptografia Computacional O uso de rede de computadores, cada vez em maior número de aplicações, depende diretamente da confiabilidade que tais redes oferecem. É necessário proteger as men- sagens e dados que trafegam nestes meios de comunicação de maneira que somente pessoas ou processos autorizados possam utilizá-los. É a criptografia que cuida de fornecer segurança e proteção à transmissão dessas informações e cujos objetivos são: • Sigilo de informação que é a garantia de que somente pessoas autorizadas te- nham acesso às informações. O acesso a saldos bancários em caixas automáticos é um exemplo disso, onde somente as pessoas autorizadas, mediante cartão e senha pessoal, têm acesso a esse tipo de dados. • Integridade de informação que garante que a mesma não sofra nenhum tipo de alteração, intencional ou não, de seu conteúdo, ou seja, que a informação se encontre inalterada. Um exemplo desse tipo de aplicação é o banco de dados de uma universidade que contém os históricos escolares dos alunos. A criptografia dificulta a fraude nas notas dos alunos. 4 • Autenticação de informação serve para identificar pessoas ou processos com quem se está estabelecendo comunicação. Como exemplo, a assinatura digital é um análogo computacional à assinatura em um documento tradicional. • Não repúdio que evita que uma das partes envolvida na comunicação negue o envio ou o recebimento de uma informação. Um exemplo disso seria uma empresa que autoriza uma entidade a comprar uma propriedade e depois nega que autorizou tal negociação. 1.1 Sistemas Criptográficos Um sistema criptográfico é um conjunto de processos criptográficos que fornece segurança de informações. Um sistema criptográfico consiste de : • Um conjunto finito A que chamamos de alfabeto de entrada. O alfabeto de entrada pode ser o alfabeto latino, o alfabeto binário ou qualquer alfabeto de alguma ĺıngua. Em se tratando de criptografia computacional, geralmente o alfabeto binário será usado como alfabeto de entrada. Convém observar que qualquer tipo de alfabeto pode ser representado como uma cadeia de strings do alfabeto binário. • Um conjunto M formado por cadeias finitas de elementos de A. Chamamos a este conjunto de espaço de mensagens. Cada elemento deM corresponde a um texto simples, não cifrado. • Um conjunto C também formado por cadeias finitas de elementos de A. Este é o chamado espaço de mensagens codificadas e cada elemento de C corresponde 5 a um texto cifrado. • K um conjunto finito de elementos chamados de chaves que são ferramentas necessárias para manter oculta uma informação. • E espaço de funções e :M→ C onde cada função codifica os elementos de M. E é o espaço de funções de codificação. • D espaço de funções d : C →M onde cada função decodifica os elementos de C. Cada elemento k1 ∈ K determina uma única bijeção de M em C que denotamos por ek1 . Assim, temos que existe k2 ∈ K que determina uma função de decodificação dk2 que é inversa à ek1 . Quando se projeta um sistema criptográfico deve-se estar atento ao fato de que o sistema deve permanecer seguro mesmo quando os algoritmos de codificação e de decodificação são de conhecimento público. Com esse objetivo usam-se pares de chaves, uma para codificação e outra para decodificação, devendo haver uma grande número de pares de chaves. A figura a seguir esboça um sistema criptográfico t́ıpico onde duas funções são utilizadas: Exemplo 1.1.1. Um sistema criptográfico simples é o cifrário de César que já menci- onado anteriormente. Consiste em substituir uma letra por outra, três casas adiante. Os conjuntosM e C constituem ambos de textos formados pelas 26 letras do alfabeto latino. Pode-se variar o valor de casas que devemos transladar cada letra e tal valor consiste na chave de codificação. Obviamente esses valores estão no intervalo [0, 25]. A chave de decodificação é a mesma que a de decodificação. As funções de codificação 6 Figura 1.1: Sistema Criptográfico e decodificação são as translações “avançada” e “retroativa”, respectivamente, em três casas no alfabeto. 1.2 Funções Unidirecionais As funções de codificação e de decodificação usadas em criptossistemas são exem- plos t́ıpicos de funções unidirecionais. A seguir definiremos funções unidirecionais. Definição 1.2.1. Uma função unidirecional f é uma função computacionalmente viável (em tempo, espaço e dinheiro) de se calcular f(x) dado x e computacionalmente inviável determinar x tal que f(x) = y dado y. A unidirecionalidade de uma função pode ser uma caracteŕıstica intŕınseca da própria função ou depender do estado da arte do avanço tecnológico e cient́ıfico como veremos no exemplo a seguir. 7 Exemplo 1.2.1. A multiplicação de dois primos grandes (pelo menos 100 d́ıgitos) é facilmente calculada com a tecnologia atual, mas dado o produto de dois primos (pelo menos 200 d́ıgitos decimais) obter a fatoraçãodo produto não é viável com a tecnologia atual. A segurança do criptossistema RSA (próximo caṕıtulo) é baseado na incapacidade de fatorar um número grande rapidamente. Exemplo 1.2.2. Outro exemplo de função unidirecional é a exponenciação módulo um número, isto é, f(x) = ax (mod n), dados a, x e n, com x ≥ 0 e n > 0. Esta é uma função viável de se calcular cujo tempo de execução é O(lg x lg2 n) [7, Cap.5]. Agora, dados a, n e ax (mod n), calcular x é inviável. Ainda não existe um algoritmo para este problema cuja execução seja em tempo polinomial. Existem dois tipos de funções unidirecionais que podem ser com segredo ou sem segredo. Uma função unidirecional é com segredo quando existe uma informação (o segredo) que possibilita a computação de sua inversa e sem segredo caso contrário. No caso da função fatoração de primos, no exemplo acima, a função é sem segredo. 1.3 Criptossistemas Simétricos e Assimétricos Quando a chave de decodificação e a chave de codificação são as mesmas em um dado criptossistema ou quando a função de decodificação é uma função com- putacionalmente viável da chave de codificação , precisamos manter a chave em sigilo, sendo conhecida apenas pelos usuários leǵıtimos. Neste caso, o sistema é dito simétrico ou de chave secreta. O cifrário de César é um exemplo de criptossistema simétrico. 8 O sistema simétrico mais conhecido é o DES - Data Encryption Standard adotado pelo governo americano em 1977 como padrão de codificação para uso em seus órgãos governamentais não relacionados à segurança nacional. Por não ser objeto de nosso estudo não descreveremos o DES neste trabalho. A descrição de seu funcionamento pode ser obtida nas referências [23] e [24]. Nos criptossistemas assimétricos ou de chave pública, a chave de codificação é publicada, ou seja, acesśıvel à todos. O conhecimento da chave de codificação não compromete a segurança do sistema. O processo de codificação também é público e somente a chave de decodificação é mantida em segredo pelo destinatário leǵıtimo da mensagem. A idéia de um sistema de chave pública foi inicialmente introduzido por Diffie e Hellman em 1976. O RSA é um sistema criptográfico assimétrico e foi o primeiro criptossistema de chave pública criado. A partir disso, surgiram muitos outros crip- tossistemas de chave pública. O RSA será descrito no próximo caṕıtulo. Nos sistemas de chave pública, cada usuário possui um par de chaves, sendo que uma é a chave de codificação, colocada à disposição daqueles que desejam enviar uma mensagem para o proprietário da chave. Suponhamos que um usuário A deseje enviar uma mensagem m para um outro usuário B. Então o usuário A consulta a lista de chaves públicas e obtém a chave de codificação PB de B. A aplica PB à mensagem m e obtém o texto codificado PB(m) e envia para B. Após receber PB(m), B aplica a chave secreta SB e obtém m = SB(PB(m)). Assim, todos os usuários que enviam mensagens codificadas a B usam a mesma chave pública PB, entretanto, somente B tem acesso à chave secreta SB. 9 Caṕıtulo 2 O Sistema de Chave Pública RSA O criptossistema de chave pública RSA foi desenvolvido por R. L. Rivest, A. Shamir e L. Adleman em 1978. As iniciais dos autores deram origem ao nome do código. O RSA tem base na facilidade de computar o produto de dois primos grandes (pelos menos da ordem 10100 cada) e na dificuldade de fatorar esse produto. Antes de descrevermos o RSA, estabeleceremos alguns resultados de Teoria dos Números que serão usados para explicar como o código funciona. Definição 2.0.1. A função φ de Euler de um inteiro positivo m, denotada por φ(m), é definida como o número de inteiros positivos menores do que ou iguais a m que são relativamente primos com m. Observamos que quando p é primo, φ(p) = p− 1. Definição 2.0.2. Um conjunto {r1, r2, . . . , rφ(m)} é um sistema reduzido de reśıduos módulo m se cada um de seus elementos é relativamente primo com m e ri 6≡ rj (mod m) quando i 6= j. 10 Teorema 2.0.1 (Euler). Se m ∈ Z, m > 0 e a ∈ Z é tal que a ∈ Z∗m, então aφ(m) ≡ 1 (mod m). Prova. Seja {r1, r2, . . . , rφ(m)} um sistema reduzido de reśıduos módulo m. Como mdc(a, m) = 1, então {ar1, ar2, . . . , arφ(m)} também é um sistema reduzido de reśıduos módulo m (a demonstração deste resultado pode ser encontrada em [32, Teorema 2.12]). Isto implica que cada ari é congruente a exatamente um dos rj’s, 1 ≤ j ≤ φ(m). Logo o produto dos ari’s deve ser congruente ao produto dos rj’s módulo m, ou seja, ar1 · ar2 · · · arφ(m) ≡ r1 · r2 · · · rφ(m) (mod m). Então aφ(m)r1 · r2 · · · rφ(m) ≡ r1 · r2 · · · rφ(m) (mod m). (2.0.1) Pelas caracteŕısticas de sistema reduzido de reśıduos módulo m, então o produto Π φ(m) j=1 rj é relativamente primo com m. Podemos, então, cancelar Π φ(m) j=1 rj em ambos os lados da congruência (2.0.1), obtendo aφ(m) ≡ 1 (mod m). � 11 Teorema 2.0.2. Sejam a, b, m ∈ Z com m > 1 e a ∈ Z∗m. Então a congruência ax ≡ b (mod m) possui solução única módulo m. Prova. Este resultado é uma conseqüência do Teorema 2.8 apresentado em [32]. � 2.1 Geração das Chaves Nesse criptossistema, cada usuário possui uma chave de codificação e outra de decodificação. Para gerar o par de chaves cada usuário realiza o seguinte pré-cálculo: • Seleciona-se dois primos grandes p e q (veremos mais adiante que tais primos devem obedecer alguns requisitos para manter a segurança do método). • Calcula-se o produto n = pq e φ(n) = (p− 1)(q − 1). • Gera-se um inteiro e, 1 < e < φ(n) tal que mdc(e, φ(n)) = 1 (também temos que tal expoente deve obedecer certos critérios de segurança [24, §8.2.2 Security of RSA]). • Determina-se d, 0 ≤ d < φ(n) tal que ed ≡ 1 mod φ(n), ou seja, d é o inverso multiplicativo de e módulo φ(n). A geração dos primos p e q será discutida no caṕıtulo seguinte sobre primalidade. Obtidos tais primos, facilmente se calcula n e φ(n). Usando-se um gerador pseudo- aleatório podemos obter e e determinamos o mdc(e, φ(n)) através do algoritmo de Euclides cuja a complexidade é O(lg2(φ(n))) [7, Cap.4]. A solução d da congruência 12 ed ≡ 1 mod φ(n) também pode ser obtida através do algoritmo estendido de Euclides [13, Seção 31.4]. Feitos os cálculos acima, o usuário publica P = (e, n) como chave de codificação e mantém em segredo S = (d, n) (na verdade, somente d é mantido em segredo) que é a chave de decodificação. Observamos que d determinado acima existe e é único, conforme o Teorema 2.0.2. 2.2 Codificação e Decodificação Agora veremos como as chaves P e S geradas acima são aplicadas para codificar e decodificar mensagens. Inicialmente, a mensagem é convertida em uma seqüência de números binários. Essa seqüência gerada é quebrada em blocos de bits que repre- sentam inteiros m no intervalo [0, n). Então cada bloco m é codificado. A codificação associada a chave P = (e, n) é feita através da função P (m) = me (mod n) e a decodificação de uma cifra c := P (m) em relação a chave S = (d, n) é dada por S(c) = cd (mod n). Dessa forma, o RSA é um criptossistema cujo alfabeto de entrada é o alfabeto binário, o espaço de posśıveis mensagens e o espaço de mensagens codificadas é o conjunto Zn. As exponenciações modulares podem ser efetuadas rapidamente como citamos no Exemplo 1.2.2. Além disso, temos que calcular a inversa da função exponencial módulo n é computacionalmente intratável. 13 Chega o momento de se verificar se o método acima realmente funciona, ou seja, se decodificando um bloco codificado obtemos o bloco da mensagem original. O próximo teorema responde a esta questão. Teorema 2.2.1. A decodificação do RSA funciona. Prova. Seja c = P (m) = me (mod n) a codificação de um bloco m. Como ed ≡ 1 mod φ(n), existe t talque ed = 1 + tφ(n). Se mdc(m, p) = 1, usando o Teorema 2.0.1 temos que mp−1 ≡ 1 (mod p). Então (mp−1)t(q−1) = = mt(p−1)(q−1) ≡ 1 (mod p) ⇒ m1+t(p−1)(q−1) = med ≡ m (mod p). Agora, se mdc(m, p) = p, então a última congruência é válida novamente pois cada lado é congruente a 0 módulo p. Assim, temos med ≡ m (mod p) em todos os casos. De forma análoga, med ≡ m (mod q). Como p e q são primos distintos, então med ≡ m (mod n). Dáı, cd = (me)d ≡ m (mod p). � 2.3 Assinatura Digital Uma caracteŕıstica importante do sistema RSA é que S(P (m)) = P (S(m)), isto é, S e P comutam. De fato, S(m) ≡ md mod n ⇒ P (S(m)) ≡ (md)e mod n ⇒ P (S(m)) ≡ med mod n ⇒ P (S(m)) ≡ m mod n, e conforme a demonstração do Teorema 2.2.1 temos S(P (m)) ≡ m mod n. 14 Os sistemas em que a codificação e a decodificação comutam são ditos sistemas comutativos e admitem uma assinatura digital natural. Assim, no sistema RSA é posśıvel “decodificar” uma mensagem e depois “codificar” o resultado. Suponhamos que um usuário A deseje enviar uma mensagem assinada a um usuário B. Para isso, basta que A envie o texto SA(m). Somente A tem a chave secreta SA usada para computar SA(m). B aplica a chave pública de A a SA(m) para obter o texto original m = PA(SA(m)). Qualquer usuário com o uso de PA pode verificar que A é realmente o remetente da mensagem, pois somente A tem acesso a chave SA. 2.4 Segurança do RSA Veremos que a segurança do RSA depende em grande parte da dificuldade em fatorar números grandes. Analisaremos as posśıveis maneiras de obter a mensagem original codificada pelo RSA. Fatorar n implica decodificar uma mensagem no RSA, pois encontrando os fatores de n, é posśıvel calcular φ(n). Como ed = 1 (mod φ(n)), então a solução d dessa congruência pode ser obtida facilmente através do Algoritmo Estendido de Euclides. Agora, analisaremos algumas posśıveis maneiras de obter a mensagem original codificada pelo RSA conhecendo-se somente a chave pública. Suponhamos que seja posśıvel determinar de alguma forma φ(n) usando o par (e, n) sem ter que fatorar n. Logo, n e φ(n) são conhecidos. Sabendo que existem p e q tais que n = pq e φ(n) = (p− 1)(q − 1) temos que φ(n) = (p− 1)(q − 1) = pq − (p + q) + 1 = n− (p + q). 15 Assim, conhecemos p + q = n− φ(n) + 1. Também temos que (p + q)2 − 4n = (p2 + 2pq + q2)− 2pq = p2 − 2pq + q2 = (p− q)2. A partir disso, o valor de p− q = √ (p + q)2 − 4n também é conhecido. De posse dos valores de p+ q e p− q, obtemos os valores de p e q, isto é, achamos a fatoração de n. Se de alguma maneira podermos determinar d somente com o conhecimento de n e e, então encontramos a fatoração de n. De fato, como ed− 1 = tφ(n), isto significa que encontramos um múltiplo de φ(n). É posśıvel fatorar n a partir de qualquer múltiplo de φ(n). Miller [25] mostrou que considerando-se a Hipótese Estendida de Riemman, isto pode ser feito de maneira eficiente. Outra maneira de se conseguir m seria inverter a função de codificação, isto é, encontrar a raiz e-ésima módulo n. Até agora não se conseguiu provar que inverter a função de codificação, dado o par (e, n) e a codificação de c := me (mod n), é equivalente a fatorar n. Porém sabemos que este problema é computacionalmente inviável, conforme exemplo 1.2.2. Até o momento, não se conhece uma maneira eficiente de fatorar um número grande. Assim, o RSA tem se mostrado seguro com a tecnologia atual. Para manter tal segurança deve-se tomar alguns cuidados para com relação a escolha dos parâmetros p e q: • os números p e q não podem ser próximos um do outro, caso contrário estarão próximos da √ n o que torna posśıvel fatorar n através da fatoração de Fermat que será apresentado no último caṕıtulo. 16 • Os números p − 1 e q − 1 devem ter fatores primos grandes. Com alguns algoritmos de fatoração conhecidos, fica fácil fatorar n se p − 1 e q − 1 tem fatores pequenos, como é o caso do algoritmo ρ− 1 de Pollard. • O mdc(p− 1, q − 1) deve ser pequeno [10, Cap.4] 17 Caṕıtulo 3 Testes de Primalidade Desde a antiguidade até os tempos atuais, os números primos têm atráıdo a atenção de muitos estudiosos. Em tempos remotos, Erastóstenes (240 a.C aproxi- madamente) desenvolveu uma maneira de determinar se um dado inteiro positivo n é primo. Para isto basta tentar dividir n por todos os inteiros menores do que ou iguais a √ n (em [32] o Teorema 1.15 garante que se n não é primo, então n tem um fator primo menor do que ou igual a √ n). Assim se n não for diviśıvel por nenhum dos números, então n é primo. Tal método é conhecido como Crivo de Erastóstenes. No entanto, este método torna-se impraticável quando n é muito grande. Posteriormente, surgiram outros métodos como, por exemplo, o Teste de Pepin que determina se um número de Fermat é primo, o Teste de Lucas-Lehmer para determinar a primalidade de um número de Mersenne , e outros. Atualmente, uma das razões para que a primalidade de números tenha recebido mais atenção é o seu uso em diversos criptossistemas como, por exemplo, o RSA. Vimos que é de grande importância para a Criptografia RSA a capacidade de produzir primos grandes de forma genérica e provar que estes são realmente primos. 18 O problema de gerar um primo grande, a prinćıpio, pode ser resolvido escolhendo- se inteiros aleatórios em um intervalo espećıfico e testando a primalidade de tais números. Neste caṕıtulo, apresentaremos alguns dos testes de primalidade existentes, nos restringindo àqueles que testam a primalidade de números genéricos . Os dois pri- meiros testes apresentados são testes probabiĺısticos: o teste de Solovay-Strassen e o teste de Miller-Rabin com bases em resultados importantes da Teoria de Números. É importante ressaltarmos que tais testes quando respondem que dado número é primo devemos ter em mente que isto é apenas uma boa evidência que tal número seja mesmo primo. Em muitas aplicações isto já é o suficiente, como é o caso em que procuramos por um primo grande. No entanto, estes testes não produzem certifica- dos de primalidade, provas de que o número seja realmente primo. E se realmente é necessária uma prova de primalidade aplica-se outros tipos de testes, como é o caso do algoritmo de Goldwasser-Killian e de Atkin, baseados na teoria de curvas eĺıpticas. Tais algoritmos, no entanto, não fazem parte deste trabalho. Maiores informações sobre esses algoritmos podem ser obtidas em [6] e [17]. Por último, apresentaremos um algoritmo determińıstico que testa a primalidade de um número em tempo polinomial. Tal algoritmo foi apresentado recentemente, constituindo um dos mais novos resultados relacionados à primalidade e que tem ganho grande admiração por todos da área. 19 3.1 Distribuição de Primos Para gerar um primo em um intervalo dado escolhemos um inteiro ı́mpar aleatório e verificamos se este inteiro é primo. Se não for primo, geramos outro inteiro e testamos sua primalidade. Continuamos com este processo até encontrarmos um número primo. Mas quantos candidatos devemos testar até encontrar um provável primo? A melhor forma de responder à esta pergunta é usando a chamada função π. Se x > 0, π(x) é definida como sendo o número de primos menores do que ou iguais a x. O Teorema dos Números Primos [1] afirma que: lim x→∞ π(x) x log(x) = 1. Então, x log(x) é uma boa aproximação para π(x) quando x for suficientemente grande. Assim, podemos estimar que um inteiro x escolhido aleatoriamente tem pro- babilidade igual a 1 log(x) de ser primo, isto é, temos que examinar aproximadamente log(x) inteiros próximos de x para acharmos um número primo da mesma ordem que x. Um exemplo disso é que temos que testar log 10100 ≈ 230 candidatos, aproxima- damente, até encontrarmos um primo de 100 d́ıgitos decimais, e este valor pode ser reduzido à metadese considerarmos somente os números ı́mpares. Uma média de 115 candidatos que terão que ser testados. 20 3.2 Teste de Solovay-Strassen A fim de descrever o teste de Solovay-Strassen introduziremos alguns conceitos matemáticos, incluindo o Critério de Euler. Definição 3.2.1. Sejam p um primo positivo ı́mpar e a ∈ Z. Se a ∈ Z∗p e se existe uma solução da congruência x2 ≡ a mod p, então a é chamado um reśıduo quadrático módulo p. Se não existe solução, então a é dito ser um reśıduo não quadrático módulo p. Definição 3.2.2. Seja a um inteiro. Para um primo ı́mpar p > 1, definimos o śımbolo de Legendre ( a p ) por ( a p ) = 0, se a ≡ 0(mod p) 1, se a é reśıduo quadrático mod p −1, se a é reśıduo não quadrático mod p. Definição 3.2.3. Seja um número n > 1 um inteiro ı́mpar com decomposição n = k∏ i=1 peii . Então o Śımbolo de Jacobi é definido como(a n ) = k∏ i=1 ( a pi )ei = ( a p1 )e1 ( a p2 )e2 . . . ( a pk )ek . O śımbolo de Jacobi é uma generalização do śımbolo de Legendre. Propriedades do Śımbolo de Jacobi Sejam m e n inteiros ı́mpares positivos, e sejam a, b inteiros. Então a. ( a mn ) = ( a m ) ( a n ) 21 b. ( a n ) = ( b n ) , se a ≡ b(mod n). As demonstrações destas propriedades se encontram em [7, Teorema 5.9.2]. Teorema 3.2.1 (Critério de Euler). Se p é um primo positivo ı́mpar e a ∈ Z∗p, então a p−1 2 ≡ ( a p ) (mod p). (3.2.1) Prova. Suponhamos, primeiramente, que ( a p ) = 1. Então, existe x tal que x2 ≡ a(mod p). Do fato que mdc(a, p) = 1 e p|(x2−a) conclúımos que mdc(x, p) = 1. Logo, pelo Teorema 2.0.1, xp−1 ≡ 1(mod p) e, portanto, a p−1 2 ≡ ( x2 ) p−1 2 = xp−1 ≡ 1(mod p). Consideremos agora o caso ( a p ) = −1. Já vimos acima que se a for um reśıduo quadrático então x p−1 2 ≡ 1(mod p). A congruência f(x) = x p−12 −1 ≡ 0(mod p) possui no máximo p−1 2 soluções incongruentes módulo p (ver Teorema 5.2 em [32]). No entanto, do fato de existirem p−1 2 reśıduos quadráticos e de termos a p−1 2 ≡ 1(mod p) para todo reśıduo quadrático, conclúımos que todos estes reśıduos quadráticos são soluções de f(x) ≡ 0(mod p), o que nos garante que f(x) ≡ 0(mod p) possui exatamente p−1 2 ráızes, e que se a não for reśıduo quadrático, isto é, ( a p ) = −1, então a p−1 2 6≡ 1(mod p). Como ap−1 − 1 = (a p−12 − 1)(a p−12 + 1) e ap−1 − 1 ≡ 0(mod p) para mdc(p, a) = 1, conclúımos que a (p−1) 2 ≡ ±1(mod p). Assim, se ( a p ) = −1, temos a p−12 ≡ −1(mod p). Portanto, a p−12 = ( a p ) (mod p). � 22 Desta forma, o Critério de Euler nos diz que se a n−1 2 6≡ ( a n ) (mod n) para algum a tal que a ∈ Z∗n, então n é composto e a é dito testemunha da composição de n. Se um número n composto satisfaz a congruência (3.2.1), n é denominado pseudoprimo de Euler para a base a. Chamamos de número de Carmichael o composto n que satisfaz (3.2.1) para todo a ∈ Z∗n. Lema 3.2.1. Se n é um número de Carmichael, então n não é diviśıvel pelo quadrado de nenhum primo e é diviśıvel por pelo menos 3 primos distintos. Prova. Demonstração em [7, Teorema 9.3.6]. � Consideraremos, agora, o conjunto E(n), importante nos próximos resultados, definido como o conjunto de bases a ∈ Z∗n tal que n satisfaz a congruência (3.2.1) do Critério de Euler, ou seja, E(n) = { a ∈ Z∗n : (a n ) ≡ a n−1 2 (mod n) } . Lema 3.2.2. Seja n um inteiro ı́mpar, n ≥ 3. Portanto, n é primo se, e somente se, E(n) = Z∗n. Prova. Se n é primo, então, usando o Critério de Euler, temos ( a n ) ≡ an−12 (mod n) para todo a ∈ Z∗n. Logo, E(n) = Z∗n. Reciprocamente, suponhamos que E(n) = Z∗n e n seja composto. Então, para todo a ∈ Z∗n tem-se: an−1 ≡ (a n )2 ≡ 1(mod n). 23 Como n é um número de Carmichael, então não é diviśıvel pelo quadrado de nenhum primo (conforme Lema 3.2.1). Então n = p · q, com p primo, q > 1 e mdc(p, q) = 1. Sejam g um reśıduo não quadrático módulo p, e seja a ≡ g(mod p) e a ≡ 1(mod q), pelas propriedades do śımbolo de Jacobi temos que (a n ) = ( a pq ) = ( a p ) ( a q ) = ( g p ) ( 1 q ) = (−1)(+1) = −1. Já que supomos que ( a n ) = −1 ≡ an−12 (mod n) para todo a ∈ Z∗n ⇒ ⇒ an−12 ≡ −1(mod q), o que contradiz o fato de a ≡ 1(mod q). � Baseado no teorema acima descoberto por R. Solovay e V. Strassen, inicialmente apresentado em [34], descreveremos a seguir um algoritmo para testar a primalidade de um número ı́mpar ≥ 3. Algoritmo 1 (SOLOVAY-STRASSEN(n)). escolha a aleatório em {1, . . . , n− 1} 1. se mdc(a, n) 6= 1 então retorne “composto” e pare senão 2. se ( a n ) 6≡ an−12 (mod n) então retorne “composto” e pare senão retorne “primo” 24 O algoritmo SOLOVAY-STRASSEN [7] nos diz que tomando-se aleatoriamente um número a ∈ {1, . . . , n− 1} onde n é um inteiro ı́mpar, verificamos se mdc(a, n) 6= 1, o que implica n ser composto. Mas se mdc(a, n) = 1, computamos o reśıduo ε = a n−1 2 (mod n) e o śımbolo de Jacobi δ = ( a n ) . Se δ = ε, então o algoritmo retorna que n é primo. Caso contrário, n é composto. Obviamente, se n é primo, o algoritmo responderá corretamente, pois no passo (1) o algoritmo nunca encontrará mdc não trivial e pelo Critério de Euler a congruência sempre é satisfeita e o passo (2) sempre retornará que n é primo. Mas sendo n composto, qual a probabilidade de o algoritmo retornar “primo”? A proposição a seguir afirma que a probabilidade de erro menor do que ou igual a 1 2 . Teorema 3.2.2. Se n é um número composto ı́mpar, então para pelo menos metade de todas bases a ∈ {1, . . . , n−1} o algoritmo SOLOVAY-STRASSEN retornará “composto”. Prova. Seja n um composto ı́mpar. Se a /∈ Z∗n, o passo (1) retorna “composto”. Consideremos a ∈ Z∗n. Usando o Lema 3.2.2, temos E(n) 6= Z∗n. Como E(n) é subgrupo de Z∗n, segue que E(n) é um subgrupo próprio de Z∗n. Logo: |E(n)| ≤ 1 2 |Z∗n| ≤ n− 1 2 , pelo Teorema de Lagrange. Portanto, no máximo metade dos números entre 1 e n − 1 conduzirão a uma resposta de que n é primo. � 25 O algoritmo SOLOVAY-STRASSEN tem complexidade O(lg3 n) bit operações, já que podemos calcular mdc(a, n) e o śımbolo de Jacobi ( a n ) usando O(lg2 n) bit operações, e a n−1 2 (mod n) usando O(lg3 n) bit operações (para maiores detalhes da complexidade acima ver [7, Teorema 9.4.2]). Assim, o resultado de Solavay e Strassen nos garante que se n é um primo, o algoritmo sempre retornará “primo”, pois a congruência (3.2.1) vale para cada a ∈ {1, . . . , n − 1} gerado e também garante uma margem de erro menor do que ou igual a 1 2 para cada vez que aplicarmos o algoritmo para uma determinada base a, se n não é primo. Se aplicarmos o teste k vezes para distintos valores de a, então as chances de n ser realmente primo, quando o teste o declara primo, é de pelo menos 1− 1 2k . 3.3 Teste de Miller-Rabin Discutiremos, agora, outro teste probabiĺıstico baseado no conceito de pseudoprimo forte. Inicialmente, veremos alguns resultados importantes relaciona- dos ao teste de Miller e Rabin Definição 3.3.1. O menor expoente e tal que ae ≡ 1(mod n) é chamado ordem de a módulo n e denotado por e = ordna. Lema 3.3.1 (Pocklington). Seja n um inteiro positivo. Suponhamos que n − 1 = qkr, k ≥ 1, onde q é primo e q - r. Se existe a tal que an−1 ≡ 1(mod n) e mdc(a n−1 q − 1, n) = 1, então para todo primo p|n temos p ≡ 1(mod qk). 26 Prova. Suponhamos que a satisfaça as hipóteses do lema. Seja p um primo tal que p|n e seja t = ordpa. Como an−1 ≡ 1(mod n), sabemos que an−1 ≡ 1(mod p). Assim, t|(n−1) = qkr. Além disso, como mdc(a n−1 q −1, n) = 1, então temos a n−1 q 6≡ 1(mod p) e t não divide (n − 1)/q = qk−1 · r. Dáı, qk|t. Já que t|(p − 1) segue que qk|p − 1. Portanto, p ≡ 1(mod qk). � Teorema 3.3.1. Seja n ı́mpar e n− 1 = 2kq com q ı́mpar e k ≥ 1. Se n é primo e a ∈ Z∗n, então aq ≡ 1(mod n) ou existe um i ∈ {0, 1, . . . , k − 1} tal quea2 iq ≡ −1(mod n). Prova. Consideremos a seguinte seqüência de potências módulo n: aq, a2q, . . . , a2 k−1q, a2 kq. Se n for um número primo, então pelo menos uma destas potências tem que ser congruente a 1 módulo n, pois, pelo Teorema de Euler, temos a2 kq = an−1 ≡ 1(mod n). Seja i ≥ 1 o menor expoente tal que a2iq ≡ 1(mod n). Podemos escrever a2 iq − 1 = (a2i−1q − 1)(a2i−1q + 1). Como n é primo e n|(a2iq − 1), então ou n|(a2i−1q − 1) ou n|(a2i−1q + 1). Sendo i o menor expoente tal que a2 iq − 1 é diviśıvel por n, então a2i−1q − 1 não é diviśıvel por n. Segue que n divide a2 i−1q + 1, isto é, a2 i−1q ≡ −1(mod n). 27 Conclúımos que se n é primo, então uma das potências da seqüência dada tem que ser congruente a −1 módulo n quando i ≥ 1. Agora, se i = 0 então aq ≡ 1(mod n) e a esta congruência não podemos aplicar o produto notável, pois q é ı́mpar. Portanto, se n é primo, então uma das potências da seqüência é congruente a −1 módulo n ou aq ≡ 1(mod n). � A seguir apresentaremos dois lemas importantes na análise do teste de Miller- Rabin. Para isto, definimos o conjunto S(n) = {a ∈ Z∗n ; aq ≡ 1(mod n) ou a2 iq ≡ −1(mod n)} para algum 0 ≤ i < t onde n − 1 = 2tq. Todo a 6∈ S(n) é dito testemunha forte da composição de n. Um número composto n tal que existe a ∈ S(n) é chamado de pseudoprimo forte. Lema 3.3.2. Seja n ≥ 3 um inteiro ı́mpar. S(n) = Z∗n se, e somente se, n é primo. Prova. Suponhamos que ∃a ∈ Z∗n tal que a não está em S(n), então a é testemunha da composição de n. Logo, n é composto. Reciprocamente, seja n primo. Se a ∈ Z∗n arbitrário, temos que an−1 ≡ 1(mod n). Como (a n−1 2 )2 = an−1 ≡ 1(mod n) e a equação x2 ≡ 1(mod n) tem somente duas soluções, a saber x = ±1, então a n−1 2 = a2 t−1q ≡ ±1(mod n). 28 Se a n−1 2 ≡ −1(mod n), então a ∈ S(n). Agora, se an−12 ≡ +1(mod n), novamente temos a n−1 4 = a 2tq 4 = a2 t−2q ≡ ±1(mod n). Prosseguindo desta maneira, para qualquer a ∈ Z∗n teremos ou aq ≡ 1(mod n) ou a2 jq ≡ −1(mod n) para algum j , 0 ≤ j < t. � Lema 3.3.3. Se n > 3 é um composto ı́mpar, então |S(n)| ≤ n−1 4 . Prova. Suponhamos que n = 1 + 2tq, com q ı́mpar, seja um número composto. Podemos escrever n = pe11 · · · perr . Seja k o maior inteiro tal que exista pelo me- nos um b ∈ Z∗n com b2 k ≡ −1(mod n). Notamos que k está bem definido, pois (−1)20 ≡ −1(mod n) e assim k ≥ 0. Também temos k ≤ v(u)− 1, onde u é o menor inteiro positivo tal que au = 1,∀a ∈ Z∗n e v(u) é o maior inteiro tal que 2v(u)|u. Temos pi ≡ 1 (mod 2k+1), 1 ≤ i ≤ r, pelo Lema 3.3.1, então n ≡ 1(mod 2k+1). Tomemos m = 2kq. Então 2m | (n− 1). Consideremos os seguintes subgrupos de Z∗n: J = {a ∈ Z∗n ; an−1 ≡ 1(mod n)} K = {a ∈ Z∗n ; am ≡ ±1(mod p ei i ),∀i} L = {a ∈ Z∗n ; am ≡ ±1(mod n)} M = {a ∈ Z∗n ; am ≡ 1(mod n)} . Temos M ⊆ L ⊆ K ⊆ J ⊆ Z∗n. 29 Vemos que todo a ∈ S(n) também pertence a L, pois se aq ≡ 1(mod n), então é óbvio que am ≡ 1(mod n), enquanto que se a2sq ≡ −1(mod n) para algum s então s ≤ k, pela definição de k. Mostraremos que, desde que n 6= 9, L é um subgrupo de ı́ndice pelo menos 4 em Z∗n e, a partir disto, temos que |S(n)| ≤ n−14 . Todo elemento de G = {a ∈ Z∗n; a ≡ ±1(mod p ei i ),∀i} é uma 2k-ésima potência; dáı uma m-ésima potência, basta tomar x ≡ b ou x ≡ b2(mod peii ) que implica que x2 k ≡ ±1(mod peii ) para cada i. Dessa maneira, M tem ı́ndice 2r em K = {a ∈ Z∗n ; am ∈ G}. Analogamente, M tem ı́ndice 2 em L. Assim, (K : L) = 2r−1. Logo, (Z∗n : L) ≥ (Z∗n : J)(K : L) = 2r−1(Z∗n : J). Se r ≥ 3, segue que (Z∗n : J) ≥ 4. No entanto, se r = 2 então n não pode ser um número de Carmichael que é diviśıvel por pelo menos 3 primos distintos (Lema 3.2.1). Então ∃a ∈ Z∗n com an−1 6≡ 1(mod n), e assim J é um subgrupo próprio de Z∗n e portanto (Z∗n : J) ≥ 2. Logo, (Z∗n : L) ≥ 4. Finalmente, se r = 1 então n = pe, e ≥ 2. Mas então, |J | = p − 1, e (Z∗n : J) = = pe−1 ≥ 4, exceto quando pe = 9. Quando n = 9 existem exatamente 2 elementos de S(n), a saber 1 e −1. Então, o número de elementos é ≤ n−1 4 . � Como resultado deste lema, descreveremos um algoritmo para testar a primali- dade de n [7, Cap.9]. 30 Algoritmo 2 (MILLER-RABIN(n)). 1. escolha a ∈ {1, . . . , n− 1} aleatório 2. escreva n− 1 = 2tq, q ı́mpar 3. calcule sucessivamente a0 = a q(mod n), a1 = a 2 0(mod n), . . . , ak = a 2 k−1(mod n) até que k = t ou ak ≡ 1(mod n) 4. se k = t e ak 6≡ 1(mod n) retorne “composto” 5. senão se k = 0 então retorne “primo” 6. senão se ak−1 6≡ −1 (mod n) então retorne “composto” 7. senão retorne “primo” Teorema 3.3.2. Se n é primo, então MILLER-RABIN sempre retornará “primo”. Prova. No passo (4) nunca retornará “composto”, já que sempre existe j tal que a2 jq ≡ 1(mod n), 1 ≤ j ≤ t. Seja k o menor ı́ndice tal que ak ≡ 1(mod n), isto é, ak = a 2kq ≡ 1(mod n). Se k = 0, o algoritmo retornará “primo” em (5). Caso contrário, devemos ter ak−1 ≡ −1(mod n), o algoritmo retorna “primo” nos passos (6) e (7). � 31 Teorema 3.3.3. Se n é um número composto, então o algoritmo MILLER-RABIN re- torna “composto” para pelo menos 3 4 de todos os a ∈ Z∗n. Prova. Seja n um composto ı́mpar. Se a 6∈ Z∗n, então nunca acontecerá a situação onde teremos a2 tq ≡ 1(mod n). Teremos então k = t e ak 6≡ 1(mod n). Logo, o passo (4) declarará que n é composto. Agora, se a ∈ Z∗n, pelo Lema 3.3.3 temos que pelo menos 3/4 de todos a ∈ Z∗n são testemunhas fortes da composição de n e para estes valores de a o algoritmo retornará “composto”. � Observamos que a maior parte do tempo gasto pelo algoritmo é para calcular aq, a2q, . . ., a2 tq(mod n). Podemos calcular aq(mod n) usando O(lg3 n) bit operações via um algoritmo que calcula potências módulo n (detalhes da complexidade do algoritmo em [7, Teorema 9.4.5]) , e para calcular o restante das potências fazendo o quadrado módulo n que também usa O(lg3 n) bit operações. Desta forma, se n é primo, o algoritmo responderá corretamente que n é primo. Mas, se n é composto, as chances do algoritmo retornar “primo” é de no máximo 1 4 . Assim, o algoritmo procurará encontrar uma testemunha de composição para n. Se nenhuma testemunha é encontrada, então é declarado “primo” com probabilidade de acerto de pelo menos 1 − 1 4 . E se não é detectada nenhuma testemunha após k aplicações do teste de Miller-Rabin com diferentes bases aleatórias, a taxa de erro diminui para 1 4k . Entretanto, tal taxa de erro é frequentemente muito menor. Monier [26] dá uma fórmula exata para esta margem de erro, que nunca excede (φ(n)/2r−1 − 2)/(n − 3) 32 onde r é o número de fatores primos distintos de n e φ(n) é a função de Euler. Miller [25] e Bach [8] observaram que se assumirmos que a Hipótese Generalizada de Riemann é verdadeira, um número é primo se, e somente se, passa pelo teste para todas as bases a com 1 < a ≤ 2(log(n))2. Isto faz com que o teste de Miller-Rabin se torne determińıstico. Também podemos obter uma versão determińıstica para o teste de Solovay-Strassen considerando a Hipótese Generalizada de Riemann. 3.4 Teste de Agrawal-Kayal-Saxena Até há pouco tempo atrás, os algoritmos existentes para testar primalidade ou eram probabiĺısticos com complexidade polinomial ou eram determińısticos mas pouco eficientes ou dif́ıceis de implementar. Porém em 2002, Agrawal, Kayal e Saxena do Instituto Indiano de Tecnologia em Kanpur anunciaram um teste de primalidade determińıstico polinomial que sempre funciona sem considerar conjecturas. Além disso, as ferramentas matemáticas empre- gadas são consideravelmente mais simples que em testes anteriores (em particular, o teste APR [2]). A idéia básica de tal teste tem como suporte o seguinte teorema. Teorema 3.4.1. Suponha que a ∈ Z∗p. Então p > 1 é primo se, e só se, (x− a)p ≡ (xp − a) (mod p). (3.4.1) Prova. Pelo Teorema Binomial de Newton, temos que (x − a)p= = ∑p i=0 ( p i ) (−1)p−ixiap−i. Podemos escrever P (x) = (x − a)p − (xp + (−a)p) = 33 = ∑p−1 i=1 ( p i ) (−1)p−ixiap−i. Supondo p primo, temos ap ≡ a mod p (Lema 3.4.4). Caso p ı́mpar, então (−a)p = −ap ≡ −a mod p. Caso p = 2, temos −a ≡ a mod 2, dáı (−a)p = = ap ≡ a ≡ −a mod 2. Logo, P (x) = (x−a)p− (xp−a). Como ( p i ) ≡ 0 (mod p) para 1 ≤ i < p, já que p aparece no numerador de ( p i ) , mas não no denominador. Logo, P (x) ≡ 0 (mod p). Suponhamos que p seja composto. Seja q um primo divisor de p e seja k ≥ 1 o maior inteiro tal que qk | p (p = qkc, c ∈ Z). Temos que ( p q ) = p! q!(p−q)! = = q k−1c(p−1)! (q−1)!(p−q)! . Vamos mostrar que p não divide ( p q ) . Suponhamos que p divide ( p q ) . Então qk divide ( p q ) . Isto significa que q divide (p− 1)! (q − 1)!(p− q)! = (p− 1)(p− 2) · · · (p− q + 1)(p− q)! (q − 1)!(p− q)! = (p− 1)(p− 2) · · · (p− q + 1) (q − 1)! . Logo, q|(p − j) para algum j ∈ {1, . . . , q − 1}. Assim, q|j, o que é contradição pois j < q e q primo. Desta forma, ( p q ) 6≡ 0 (mod p), 1 < q < p. Sendo mdc(a, p) = 1, então( p q ) ap−q 6≡ 0 (mod p), que é o coeficiente de xq em (x−a)p. Mas como o coeficiente de xq em xp − a é nulo, temos xp − a 6≡ (x− a)p mod p. � 34 Examinando a expansão binomial inteira de (x− a)n, tal resultado nos garantiria uma maneira infaĺıvel de saber se n é primo, pois caso todos os termos que estão no “meio” da expansão tivessem coeficientes diviśıveis por n, então n seria primo, caso contrário teŕıamos n composto. Mas um detalhe torna este tipo de teste impraticável, já que para n muito grande, teremos que examinar muitos termos na expansão binomial. A idéia do AKS é tornar o teste binomial rápido e ainda ser capaz de provar que o teste responde corretamente mesmo quando n é composto. Ao invés de trabalharmos com módulo n, trabalhamos com módulo um polinômio xr − 1 (onde r é um primo razoavelmente pequeno). Ou seja, no lugar de calcular (x− a)n, calcula-se o resto da divisão de (x− a)n por xr − 1, que é feito usando o mesmo método em Álgebra para dividir um polinômio por outro. Dessa maneira, teremos no máximo r − 1 termos para examinar , enquanto que na expansão de (x− a)n temos n− 1. Como a congruência original funciona sempre que n é primo, então é óbvio que a nova congruência (x− a)n ≡ (xn − a) mod (xr − 1, n) (3.4.2) também funciona quando n é primo, pois se duas coisas são iguais, então quando se divide essas duas coisas por xr − 1, os restos são iguais também. O que não é óbvio é que a nova congruência é sempre falsa quando n é composto, pois mesmo quando (x− a)n 6≡ (xn − a) (mod n) é posśıvel que dois diferentes polinômios tenham o mesmo resto quando divididos por xr − 1. O que o AKS mostra é que se n é composto, e se escolhemos o valor “certo” 35 de r, então precisamos testar apenas um número pequeno de a’s até encontrarmos um tal que (x− a)n 6≡ (xn − a) mod (xr − 1, n). Uma vez que encontramos tal a, provamos que n é composto. Ademais, não precisamos tomar a aleatoriamente, existe uma forma determińıstica para fazer isto. A seguir, estabeleceremos alguns resultados que serão usados posteriormente. 3.4.1 Teoria dos Números Lema 3.4.1. Seja π(n) o número de primos positivos ≤ n. Então n 6 log2 n ≤ π(n) ≤ 8n log2 n , ∀n ≥ 1. Prova. No Teorema 4.6 em [5, Cap. 4], temos a seguinte desigualdade: n 6 log n ≤ π(n) ≤ 8n log n . Vamos mostrar que a desigualdade também é válida para o logaritmo na base 2. Como log n ≤ log2 n, então π(n) ≥ n6 log n ≥ n 6 log2 n . Também temos na demonstração do Teorema 4.6 em [5] o resultado 36 π(n) ≤ n log n ( 6 log 2 + 3 e ) = n log2 e log2 n ( 6 log 2 + 3 e ) = n log2 e log2 n ( 6 1 log2 e + 3 e ) = n log2 n ( 6 + 3 log2 e e ) ≤ n log2 n ( 6 + 3× 1, 45 e ) ≤ 8n log2 n . Portanto, n 6 log2 n ≤ π(n) ≤ 8n log2 n . � Lema 3.4.2. Sejam n ≥ 2, k ≥ 1 e d ≥ 1 inteiros tais que (nk − 1)|(nd − 1). Então k|d. Prova. Seja d = qk + r, q ≥ 1 e 0 ≤ r < k. Observemos que nd − 1 nk − 1 = nr(nqr − 1) + (nr − 1) nk − 1 = nr(1 + nk + n2k + · · ·+ n(q−1)k) + n r − 1 nk − 1 . Logo, (nr − 1)/(nk − 1) é um inteiro, pois (nk − 1) divide (nd − 1). Se 1 ≤ r < k, então 0 < (nr − 1)/(nk − 1) < 1 o que não é posśıvel. Portanto, r = 0. � 37 Para o próximo lema, consideraremos a função π′(x) = |{p ; p é primo , 2 ≤ p ≤ x e P (p− 1) > x2/3}| onde P (n) é o maior divisor primo de n. Lema 3.4.3. Existe uma constante c > 0 tal que π′(x) ≥ c x log2 x para x suficientemente grande. Prova. Em [15] temos que π′(x) ≥ c x log x . Como na demonstração do Lema 3.4.1, obtemos π′(x) ≥ c x log2 x . � Lema 3.4.4. Sejam p primo e a um inteiro positivo. Então ap ≡ a (mod p). Prova. Ver demonstração em [32, Corolário 2.1] � 3.4.2 Corpos finitos Sejam p um número primo positivo e d ≥ 1 um inteiro. O anel Zp é um corpo com p elementos. Seja h(x) um polinômio irredut́ıvel de grau d no anel Zp[x], ou seja, não existem polinômios a(x) e b(x) em Zp[x] ambos com grau ≤ d tais que a(x)b(x) = h(x) em Zp[x]. O anel F := Zp[x]/(h(x)) consiste de todos os polinômios em Zp[x] de grau ≤ d, onde a adição e a multiplicação são módulo h(x). [22] 38 Lema 3.4.5. O anel F é um corpo com pd elementos. Prova. Como existem exatamente pd polinômios em Zp[x] com grau ≤ d, é óbvio que |F| = pd. Para efeito de demonstração de que F é corpo, mostraremos somente que cada polinômio não-nulo f(x) em F tem um inverso multiplicativo em F . Como o grau de f(x) é ≤ d e como h(x) é irredut́ıvel, temos que mdc(f(x), h(x)) = 1. Usando o algoritmo estendido de Euclides, obtemos dois polinômios a(x) e b(x) em Zp[x] tais que a(x)f(x) + b(x)h(x) = 1 em Zp[x]. Portanto, a(x) mod h(x) é o inverso multiplicativo de f(x). � Lema 3.4.6. Sejam K um corpo, f(x) um polinômio em K[x], e d ≥ 1 o grau de f(x). 1. Existem no máximo d elementos α ∈ K tais que f(α) = 0. 2. Existem polinômios irredut́ıveis g1(x), . . . , gm(x) em K[x], para algum inteiro m, tal que f(x) = ∏m i=1 gi(x). Prova. As demonstrações dos itens 1 e 2 se encontram em [22, Cap. 1] no Teorema 1.66 e no Teorema 1.59, respectivamente. � 39 Lema 3.4.7. O grupo multiplicativo K∗ de qualquer corpo K é ćıclico. Prova. Sejam q o número de elementos de K. Podemos assumir que q ≥ 3, ou seja, que K é um corpo não-trivial. Seja s := q − 1 a ordem de K∗ e s = pr11 . . . prmm a sua decomposição. Para cada 1 ≤ i ≤ m, o polinômio xs/pi − 1 tem no máximo s/pi ráızes em K, conforme Lema 3.4.6. Como s/pi < s, existe um elemento não nulo ai ∈ K∗ tal que a s/pi i 6= 1, pois s é a ordem de K∗. Seja bi := a s/p ri i i . Como K ∗ é um grupo multiplicativo de ordem s e ai ∈ K∗ então asi = 1. Segue que b p ri i i = a s i = 1. Seja ei a ordem multiplicativa de bi em K. Então ei|prii . Sendo pi um número primo, temos que ei = p si i para algum 0 ≤ si ≤ ri. Por outro lado, temos que b p ri−1 i i = a s/pi i 6= 1. Logo, si = ri e ei = p ri i . Seja b := b1 . . . bm, e e a ordem multiplicativa de b em K. Afirmamos que b é um gerador de K∗, ou seja, e = s. Suponhamos, por absurdo, o contrário. Já que bs = 1, seque que e|s. Sendo e um divisor próprio de s, existe um ı́ndice 1 ≤ i ≤ m tal que e divide s/pi. Suponhamos, sem perda de generalidade, que i = 1. Como b e = 1, temos que bs/p1 = 1. Observamos que bs/p1 = b s/p1 1 . . . b s/p1 m . Consideremos 2 ≤ j ≤ m qualquer. Temos que prjj divide s/p1. Como b p rj j j = 1, segue que b s/p1 j = 1. Assim, 1 = bs/p1 = b s/p1 1 . . . b s/p1 m = b s/p1 1 . 40 Segue que a ordem de b1 divide s/p1. Como a ordem de b1 é p r1 1 e s/p1 = = pr1−11 p r2 2 . . . p rm m , temos uma contradição. � Lema 3.4.8. Seja p ≥ 2 um primo e f(x) um polinômio em Zp[x]. Então, f(x)p ≡ f(xp) (mod p). Prova. A demonstração será feita por indução sobre o grau d de f(x). Se d =0 então f(x) = a para algum a ∈ Zp. Sendo p primo, temos que ap ≡ a (mod p) (Lema 3.4.4). Logo, o resultado é verdadeiro. Seja d ≥ 1. Suponhamos que o resultado seja verdadeiro para todos os polinômios em Zp[x] cujos graus sejam < d. Podemos reescrever f(x) = axd + g(x), onde a ∈ Zp e g(x) é um polinômio em Zp[x] de grau menor do que d. Então, (f(x))p = (axd + g(x))p = p∑ i=0 ( p i ) aixid(g(x))p−i. Como ( p i ) ≡ 0 (mod p) para 1 ≤ i ≤ p− 1, temos (f(x))p = (g(x))p + apxpd. 41 Pela hipótese de indução, (g(x))p ≡ g(xp) (mod p) e sendo ap ≡ a (mod p), conclúımos que (f(x))p = g(xp) + a(xp)d = f(xp). � Lema 3.4.9. Seja h(x) um fator qualquer de xr − 1. Se m ≡ mr (mod r), então xm ≡ xmr (mod h(x)). Prova. Seja m = kr+mr. Como, x r ≡ 1 mod (xr−1), então xkr ≡ 1 mod (xr−1) ⇒ xkr+mr ≡ xmr mod (xr − 1) ⇒ xm ≡ xmr mod (xr − 1). Portanto, xm ≡ xmr (mod h(x)). � Lema 3.4.10. Sejam p e r primos positivos distintos e d = ordrp . Então, todo polinômio irredut́ıvel em Zp[x] que divide x r−1 x−1 tem grau d. Prova. Seja h(x) um polinômio irredut́ıvel em Zp[x] que divide x r−1 x−1 e cujo grau é k. Pelo Lema 3.4.5, temos que F é um corpo com pk elementos. Também temos que F∗ é ćıclico de ordem pk − 1. Seja g(x) um gerador de F∗. Usando o Lema 3.4.8, temos g(x)p ≡ g(xp) (mod p) ⇒ g(x)pd ≡ g(xpd) (mod p). Seja f(x) o polinômio em Zp[x] tal que f(x)g(x) = xr − 1. Sendo pd ≡ 1 (mod r) e usando o Lema 3.4.9, temos que xpd ≡ x mod h(x). Logo, (g(x))p d ≡ g(x) mod h(x). Sendo g(x) um gerador, g(x) 6≡ 1 mod h(x). Logo, g(x) tem um inverso multi- plicativo no corpo F , o que implica (g(x))pd−1 ≡ 1 mod h(x). 42 Como pk − 1 é a ordem de g(x), temos que (pk − 1)|(pd − 1) ⇒ k|d, conforme o Lema 3.4.2. Além disso, h(x)|(xr − 1) em Zp[x] e, consequentemente, em F . Logo, xr ≡ 1 mod h(x). Já que r é primo, então r = ordh(x)x. Como a ordem de F∗ é pk−1 temos que xp k−1 ≡ 1 mod h(x), que implica r|(pk − 1), ou seja, pk ≡ 1 (mod r). Logo, d|k. Portanto, d = k. � 3.4.3 O algoritmo AKS Primeiramente, apresentaremos o algoritmo AKS [3] e posteriormente discutiremos se o algoritmo funciona e sua complexidade. Algoritmo 3 (AKS(n)). n é um inteiro positivo 1. se n é da forma ab, b > 1, então retorne “composto”; 2. r = 1; 3. enquanto r < n faça 4. se mdc(n, r) 6= 1, então retorne “composto”; 5. se r é primo, então 6. seja q o maior fator primo de r − 1 43 7. se q ≥ d4 √ r log2 ne e n r−1 q 6≡ 1 (mod r), pare; 8. r ← r + 1; 9. para a = 1 até d2 √ r log2 ne 10. se (x− a)n 6≡ (xn − a) mod (xr − 1, n), retorne “composto”; 11. Retorne “primo”. No artigo [9] é proposto um algoritmo rápido que detecta, em tempo polinomial, se um inteiro n > 1 é uma potência perfeita ou não. Assim, o passo (1) do AKS pode ser executado em tempo polinomial. O algoritmo possui dois loops. No primeiro loop, o algoritmo tenta encontrar um primo r tal que r − 1 tem o maior fator primo q ≥ d4 √ r log2 ne e que q divida a ordem multiplicativa de n módulo r. Para analisar se o algoritmo está correto e sua complexidade, consideraremos o lema a seguir. Lema 3.4.11. Para cada n suficientemente grande, existem constantes c1 e c2 po- sitivas para os quais existe um primo r, onde c1(log2 n) 6 ≤ r ≤ c2(log2 n)6 tal que q = P (r − 1) ≥ 4 √ r log2 n e q|ordrn. Prova. Sejam c como no Lema 3.4.3 e P (r−1) o maior fator primo de r−1. Seja R o número de primos r’s no intervalo [c1(log2 n) 6, c2(log2 n) 6] tal que P (r − 1) > (c2(log2 n)6)2/3 ≥ r2/3, para n suficientemente grande. 44 Assim, R = π′(c2(log2 n) 6)− π′(c1(log2 n)6) ≥ π′(c2(log2 n)6)− π(c1(log2 n)6), pois π(x) ≤ c′ x log2 x ≤ π′(x) para algum c′, de acordo com os Lemas 3.4.1 e 3.4.3. Então, R ≥ c c2(log2 n) 6 log2(c2(log2 n) 6) − π(c1(log2 n)6) ≥ c c2(log2 n) 6 log2(c2(log2 n) 6) − 8 c1(log2 n) 6 log2(c1(log2 n) 6) ≥ c c2(log2 n) 6 log2 c2 + 6 log2(log2 n) − 8 c1(log2 n) 6 log2 c1 + 6 log2(log2 n) . Como c2 ≤ log2 n para n suficientemente grande, então R ≥ c c2(log2 n) 6 log2(log2 n) + 6 log2(log2 n) − 8 c1(log2 n) 6 log2 c1 + 6 log2(log2 n) ≥ c c2(log2 n) 6 7 log2(log2 n) − 8 c1(log2 n) 6 6 log2(log2 n) = (log2 n) 6 log2(log2 n) ( cc2 7 − 8c1 6 ) . Seja c3 := ( cc2 7 − 8c1 6 ) . Escolhemos c1 ≥ 46 e c2 tal que c3 > 0. Seja x := c2(log2 n)6 e definimos N := (n− 1)(n2 − 1) · · · (nbx1/3c − 1) = ∏bx1/3c i=1 (n i − 1). Como qualquer inteiro positivo m tem no máximo log m fatores primos, então o i-ésimo termo no produto acima tem no máximo i log m ≤ i log2 n ≤ bx1/3c log2 n ≤ ≤ x1/3 log2 n fatores primos. Logo, N tem x2/3 log2 n fatores primos, no máximo. Observamos que x2/3 log2 n = c 2/3 2 (log2 n) 5 < c3(log2 n) 6 log2(log2 n) . Então, existe um primo r tal que c1(log2 n) 6 ≤ r ≤ c2(log2 n)6 e P (r − 1) ≥ r2/3, mas que r - N . Este é o primo r que procuramos. 45 De fato, sendo r2/3 = r1/6 √ r e que r1/6 ≥ c1/61 log2 n ≥ 4 log2 n, então r2/3 ≥ 4 √ r log2 n. Antes de provarmos que q|ordr(n), mostraremos que q|ordr(n) é equivalente a n r−1 q 6≡ 1 mod r. Suponhamos que q|ordr(n). Como q ≥ 4 √ r log2 n, então q ≥ r2/3 > √ r > > (r − 1)1/2 ⇒ q2 > r − 1 ⇒ q > r−1 q . Sendo ordr(n) > q, então ordr(n) > r−1 q ⇒ ⇒ n r−1 q 6≡ 1 mod r (pela definição de ordr(n)). Suponhamos que q - ordr(n). Como ordr(n)|(r − 1) (pois mdc(n, r) e nr−1 ≡ 1 mod r), temos que r − 1 = ordr(n) · d⇒ ordr(n)| r−1q ⇒ n r−1 q ≡ 1 mod r. Agora podemos mostrar que q|ordr(n). De fato, suponhamos, por absurdo, que n r−1 q ≡ 1 (mod r). Então, r|(n r−1 q − 1). Como q ≥ r2/3, r ≤ c2(log2 n)6 e x = c2(log2 n) 6, temos r − 1 q < r q ≤ r r2/3 = r1/3 ≤ (c2(log2 n)6)1/3 = x1/3. Assim (n r−1 q −1) é um termo de N . Mas isto implica que r|N , o que é contradição. � Observamos que como q é um inteiro (pois é primo), teremos que q ≥ d4 √ r log2 ne. Teorema 3.4.2. Se n é primo, então o algoritmo retorna “primo”. Prova. O primeiro loop não retornará “composto” pois mdc(n, r) 6= 1 para todo r ≤ c2(log2 n)6 onde c2 é como no Lema 3.4.11. Então, no segundo loop também não retorna ”composto”, pois a congruência (3.4.2) sempre será satisfeita. Portanto, o algoritmo sempre retorna ”primo”quando n for primo. � 46 Agora, vamos verificar se o algoritmo funciona quando temos n composto como entrada. Vamos considerar que n não seja uma potência perfeita e que todo fator primo de n seja maior do que r, pois caso contrário n seria detectado como composto no passo (1) ou (4) do algoritmo. Vamos mostrar que n será detectado no segundo loop. Seja n = pe11 · · · p ek k a decomposição de n. Neste caso, ordrn|mmc{ordr(pi)}ki=1. De fato, se λ =mmc{ordr(pi)}ki=1, então λ = ordr(pi)mi, mi escolhido para cada ordr(pi). Logo, nλ = k∏ i=1 peiλi = k∏ i=1 p ei·ordr(pi)mi i = k∏ i=1 (p ordr(pi) i ) eimi = 1. Desta forma, existe um primo p fator de n tal que q|ordrp onde q = P (r− 1) para o r encontrado no primeiro loop, pois todo fator primo de mmc{ordr(pi)}ki=1 é um fator primo para pelo menos uma ordr(pi) De agora em diante, p será tal fator primo de n. No segundo loop, o algoritmo usa o valor de r encontrado para fazer o cálculo de l = d2 √ r log2 ne binômios: (x− a) para 1 ≤ a ≤ l. Pelo Lema 3.4.10, temos um polinômio h(x) que é fator de xr − 1 de grau d = ordr(p), onde p é o fator primo de n tal que q|ordrp e tal polinômio é irredut́ıvel em Zp[x]. 47 Devemos notar que (x− a)n ≡ (xn − a) mod (xr − 1, n) ⇒ (x− a)n ≡ (xn − a) mod (h(x), p). Assim a congruência é satisfeita para cada binômio em F . O conjunto de l binômios forma um grupo ćıclico neste corpo. Lema 3.4.12. No corpo F , o grupo gerado pelos l binômios: (x− a), 1 ≤ a ≤ l, ou seja, B = { ∏ 1≤a≤l (x− a)αa ; αa ≥ 0,∀1 ≤ a ≤ l} é ćıclico com |B| > (d l )l. Prova. Demonstração é apresentada em [3] � Se d = ordrp e q|ordrp, então d ≥ q ≥ d4 √ r log2 ne ≥ 2d2 √ r log2 ne ≥ 2l. Usando o resultado do lema anterior, |B| > 2l≥ 22 √ r log2 n = n2 √ r. Seja g(x) um gerador de B. Então a ordem de g(x) em F é > n2 √ r. Este resultado nos será útil na demonstração do teorema que garante que o algoritmo retornará “composto”, se n for composto. O conjunto definido como Ig(x) = {m; g(x)m ≡ g(xm) mod (xr − 1, p)}, relacionado com o gerador g(x) de B, será importante nos seguintes resultados. 48 Lema 3.4.13. O conjunto Ig(x) é fechado em relação à multiplicação. Prova. Sejam m1, m2 ∈ Ig(x). Temos g(x)m1 ≡ g(xm1) mod (xr − 1, p), e g(x)m2 ≡ g(xm2) mod (xr − 1, p). Substituindo xm1 na segunda congruência temos, g(xm1)m2 ≡ g(xm1m2) mod (xm1r − 1, p)⇒ g(xm1)m2 ≡ g(xm1m2) mod (xr − 1, p). Disso obtemos, g(x)m1m2 ≡ (g(x)m1)m2 mod (xr − 1, p) ≡ g(xm1)m2 mod (xr − 1, p) ≡ g(xm1m2) mod (xr − 1, p). Portanto, m1m2 ∈ Ig(x) � Lema 3.4.14. Seja og a ordem de g(x) em F . Se m1,m2 ∈ Ig(x) e m1 ≡ m2 (mod r), então m1 ≡ m2 (mod og). Prova. Como m1 ≡ m2 (mod r), então m2 = m1 + kr, para algum k ≥ 0. Sendo m2 ∈ Ig(x), temos 49 g(x)m2 ≡ g(xm2) mod (xr − 1, p) g(x)m1+kr ≡ g(xm1+kr) mod (xr − 1, p) g(x)m1g(x)kr ≡ g(xm1) mod (xr − 1, p) [Lema 3.4.9] g(x)m1g(x)kr ≡ g(x)m1 mod (xr − 1, p). Temos que g(x) 6≡ 0 implica g(xm1) 6≡ 0. Então podemos cancelar g(x)m1 em ambos os lados da última congruência acima, obtendo g(x)kr ≡ 1 mod (xr − 1, p). Portanto, kr ≡ 0 mod og ⇒ m2 ≡ m1 mod og. � Este lema nos diz que existem no máximo r elementos em Ig(x) que são menores que og. Para ver isso, consideramos a contraposição do lema: Sejam m1, m2 ∈ Ig(x). Se m1 6≡ m2 mod og, então m1 6≡ m2 mod r. Também consideramos os inteiros positivos menores do que og no conjunto Ig(x). Sendo os elementos distintos módulo r. Isso implica que existe um número ≤ r de elementos do conjunto Ig(x) que são menores do que og. Teorema 3.4.3. Se n é composto, então o algoritmo retorna “composto”. Prova. Suponhamos, por absurdo, que o algoritmo retorne “primo”. Assim, o se- gundo loop assegura que para todo 1 ≤ a ≤ l, temos (x− a)n ≡ (xn − a) mod (xr − 1, n). (3.4.3) 50 Seja g(x) um gerador de B como no Lema 3.4.12. Observemos que g(x) é apenas um produto de potências de l binômios (x − a), 1 ≤ a ≤ l que satisfaz a equação (3.4.3). Sendo g(x) = ∏ 1≤a≤l(x− a)αa , temos g(x)n = ∏ 1≤a≤l (x− a)nαa ≡ ∏ 1≤a≤l (xn − a)αa mod (xr − 1, p) ≡ g(xn) mod (xr − 1, p). Assim, n ∈ Ig(x). Pelo Lema 3.4.8, também temos p ∈ Ig(x), pois g(x)p ≡ g(xp) mod p ⇒ g(x)p ≡ g(xp) mod (xr − 1, p). E 1 ∈ Ig(x), trivial- mente. Consideramos o conjunto E = {nipj; 0 ≤ i, j ≤ b √ rc}. Pelo Lema 3.4.13, E ⊆ Ig(x). Como 1 ≤ ninj < n √ rn √ r < og para todo 0 ≤ i, j ≤ b √ rc, todos os elementos de E são distintos módulo og. Pelo Lema 3.4.14, todos os elementos de E também são distintos módulo r. Dáı, |E| ≤ r. Temos que |{(i, j); 0 ≤ i, j ≤ b √ rc}| = (1 + b √ rc2) > r. Então existem dois elementos ni1pj1 e ni2pj2 em E com i1 6= i2 ou j1 6= j2, i1 ≥ i2 tais que ni1pj1 ≡ ni2pj2 (mod r), pelo Prinćıpio da Casa dos Pombos. Mas, pelo Lema 3.4.14, temos ni1pj1 ≡ ni2pj2 (mod og). Implicando ni1−i2 ≡ pj2−j1 (mod og). Como og ≥ n2 √ r e ni1−i2 , pj2−j1 < n √ r, a congruência acima torna-se uma igual- dade. Sendo p primo, esta igualdade implica que n = pk para algum k ≥ 1. Assim, n já teria sido detectado no passo (1), se k ≥ 2. Portanto, p = n, que é uma contradição. 51 � Vamos agora analisar a complexidade do algoritmo AKS. Para obter uma descrição completa das complexidades usadas na análise do algoritmo verificar a referencia [33]. Observamos que lg n ≥ log2 n, pois se n tem k bits (n = dk−12k−1 + dk−22k−2+ + · · · + d0), então 2k−1 ≤ n < 2k ⇒ log2 n < k = lg n. Então as complexidades do nosso algoritmo podem ser representadas em termos de lg n. No passo (1) o algoritmo toma um tempo O(lg3 n). Na busca por r no primeiro loop executa O(lg6 n) iterações, conforme Lema 3.4.11. Veremos, então, quanto tempo cada iteração neste loop leva. No passo (4) den- tro do loop, para calcular o mdc leva O(lg3 n). Nos passos (5) e (6), leva tempo O( √ r lg2 n) e no passo (7) O(lg2 n + lg3 r). Totalizando O(lg3 n + √ r lg2 r) cada ite- ração. Como temos um total de O(lg6 n) iterações, então a complexidade do primeiro loop é O(lg9 n+ √ r lg6 n lg2 r). Como r = O(lg6 n) então leva tempo O(lg9 n(lg lg n)2). No segundo loop, para calcular os coeficientes do polinômio (x − a)n mod (xr − 1, n) o algoritmo gasta O(r2 lg3 n). O polinômio (xn − a) mod (xr − 1, n) é calculado dentro do mesmo limite de tempo. Assim, o segundo loop leva um total de tempo O(r2 √ r lg4 n). Sendo r = O(lg6 n), então o tempo total do algoritmo é O(lg19 n). 52 Caṕıtulo 4 Fatoração de Inteiros Neste caṕıtulo, apresentaremos alguns métodos de fatoração existentes. Não des- creveremos tais métodos em seus mińımos detalhes, mas sim forneceremos uma noção de como funcionam tais métodos para estabelecermos relação com a segurança do RSA. Cabe-nos ressaltar que tais métodos devem ser aplicados a inteiros positivos que já tenham sido testados por um dos algoritmos do caṕıtulo anterior e que tais algoritmos tenham retornado que o número é composto. Isto porque o problema de decidir se um número é primo ou composto, em geral, parece ser mais fácil de se resolver computacionalmente que o problema de fatoração. Assim, antes de tentar fatorar um inteiro, devemos testar tal número a fim de ter certeza que o número é composto. Os seguintes algoritmos de fatoração que apresentaremos não fornecem todos os primos divisores que constituem a fatoração completa de um número n, mas apenas fatora o número em produto de dois inteiros da forma n = ab com a, b > 1. A partir disso, podemos usar um teste de primalidade em a e b, e se obtivermos respostas de que são compostos, aplicamos recursivamente o algoritmo de fatoração. Prosseguindo 53 dessa maneira, conseguiremos a fatoração completa de n. 4.1 Um Método Simples Tendo testado um inteiro n > 2 e verificado que é um composto, um simples algoritmo [10, 14] para determinar um fator de n é tentar dividir n por cada um dos inteiros entre 2 e √ n. Caso algum desses números divida n, então tal número é um fator de n. O menor fator encontrado desta forma é primo. Como em nosso caso estamos interessados em fatorar números muitos grandes (com no mı́nimo 200 d́ıgitos decimais), este algoritmo não é nada eficiente. Este algoritmo executa no máximo √ n divisões. Como n ≥ 10200 então √ n ≥ 10100. O algoritmo realizará no máximo 10100 divisões. Suponhamos que o computador usado na implementação do algoritmo realize 1010 divisões por segundo, o que atualmente é um número muito grande considerando o avanço tecnológico atual. Então para realizar 10100 divisões levaria 10 100 1010 = 1090 segundos, ou seja, aproximadamente 1082 anos. Isto torna nosso algoritmo impraticável tendo em vista que a idade do universo (desde o Big Bang) é estimada em 2 · 1011 anos. No entanto, este algoritmo pode ser bastante útil se o número a ser fatorado possui algum fator primo pequeno menor do que 106. Neste caso, o algoritmo obterá um fator primo de n rapidamente. Por este motivo é que se deve gerar primos p e q grandes para serem usados no RSA, caso contrário, o sistema pode ser facilmente quebrado. 54 4.2 Método de Fermat O algoritmo de Fermat [14] é eficiente para achar um fator de n que seja não muito menor do que √ n. Suponhamos que n > 0 um composto ı́mpar. A idéia do algoritmo de Fermat é tentar escrever n = x2 − y2 com x e y inteiros positivos. Se encontrarmos x e y tais que n = x2 − y2, então encontramos uma fatoração de n em produto de dois inteiros pois n = x2 − y2 = (x− y)(x + y). Assim, x− y e x + y são fatores de n. Quando n é um quadrado perfeito, ou seja, quando existe r ∈ Z tal que n = r2, temos x = r e y = 0. Mas quando y > 0, então x = √ n + y2> √ n. Isto nos sugere o algoritmo a seguir. Algoritmo 4 (FERMAT(n)). Dado n ı́mpar 1. r = b √ nc 2. se n = r2, então faça x = r e y = 0 3. senão enquanto r < n+1 2 ou s não for inteiro faça r = r + 1 s = √ r2 − n 4. Faça a = (r + s) e b = (r − s) 5. Retorne a e b Veremos agora porque o algoritmo funciona. 55 Teorema 4.2.1. O algoritmo de Fermat funciona. Prova. Para verificar que o algoritmo funciona temos que mostrar que existe x ≥ b √ nc tal que √ x2 − n seja um inteiro, o algoritmo realiza um número finito de passos. Suponhamos que n = ab com a ≤ b. O algoritmo procura por inteiros x e y tais que n = x2 − y2 = (x− y)(x + y). Como x− y ≤ x + y, então tomamos a = x− y e b = x + y. Resolvendo o sistema linear em duas incógnitas temos x = a+b 2 e y = b−a 2 . Como n é ı́mpar então a e b têm que ser ı́mpares. Logo, a + b e b − a são números pares, o que implica que x = a+b 2 e y = b−a 2 são inteiros tais que x2 − y2 = ( a + b 2 )2 − ( b− a 2 )2 = ab = n. (4.2.1) Se a = b então o algoritmo pára no passo (2). Suponhamos 1 < a < b < n. Como 1 < b e 1 < a temos que a − 1 > 0, então (a − 1) · 1 < (a − 1) · b ⇒ a− 1 < ab− b⇒ a− 1 + (b + 1) < ab− b + (b + 1)⇒ a + b < n + 1⇒ a+b 2 < n+1 2 . Por outro lado, conforme a equação (4.2.1) temos que (a + b)2 4 − (b− a) 2 4 = n ⇒ (a + b) 2 4 − n = (b− a) 2 4 ≥ 0. Logo, (a+b) 2 4 − n ≥ 0 ⇒ ( a+b 2 ) ≥ √ n ≥ b √ nc. Portanto, b √ nc ≤ x < n+1 2 . Analisando o algoritmo, temos que a variável r é inicializada com o valor b √ nc e vai sendo incrementada de uma unidade em cada loop. Como n é composto, o algoritmo encontra um valor r = a+b 2 antes de chegar a n+1 2 . � Se o número n a ser fatorado tem um fator próximo a √ n, através do algoritmo de Fermat este fator será rapidamente encontrado. Por essa razão, deve-se usar primos p e q não muito próximos um do outro na geração de chaves para o RSA. 56 4.3 ρ-Método de Pollard O algoritmo em que realizamos tentativas de dividir um número n por inteiros menores do que √ n, apresentado na seção 4.1, é eficiente no que se refere a encontrar um fator de n que não seja superior a 105. O algoritmo desta seção trabalha mais eficientemente no que se refere a encontrar um fator de um inteiro maior do que 105, no entanto limita-se a encontrar fatores de um número que não seja superior 1010. A idéia por trás do algoritmo ρ de Pollard [10, 20] é a seguinte. Escolhemos f(x) um polinômio irredut́ıvel em x (ver definição de polinômio irredut́ıvel na seção 3.4.2 do caṕıtulo anterior) com coeficientes inteiros e um valor inicial x0. Seja d um fator não trivial de n (não conhecido ainda). Recursivamente, geramos a seqüência definida por xi ≡ f(xi−1) mod n. Seja yi ≡ xi (mod d). Assim, yi ≡ f(yi−1) mod d. Como existe um número finito de classes congruência módulo d teremos yi = yj para algum par (i, j). Uma vez que isto acontece teremos yi+t = yj+t, para todo t > 0. Se yi = yj, então xi ≡ xj (mod d). Logo, d|(xi − xj) e, consequentemente, mdc(xi − xj, n) > 1 é um divisor de n. O problema é que d não é conhecido e ,como consequência, não sabemos os valores de yi e nem mesmo quando yi = yj. Neste caso, usamos a equação yi+t = yj+t como aux́ılio. Existem infinitos pares (i, j) para os quais yi = yj. Seja l o comprimento do ciclo. Se estamos fora do ciclo, qualquer par (i, j) para o qual l|(j − i) temos que j ≡ i (mod l) e, assim, yi ≡ xj. Dessa forma, encontramos uma forma sistemática de escolher pares (i, j) e para cada par calculamos mdc(xi − xj, n). Uma maneira de encontrar muitos pares (i, j) é tomar 2α < i ≤ 2α+1 para algum 57 α natural e testar se mdc(xi − x2α , n) 6= 1. Caso o mdc não seja 1 então tomamos t o menor inteiro tal que j + t = 2α e 2α < i + t ≤ 2α+1. Com relação ao polinômio usado, devemos escolher f tal que que a sequência (xi) seja parecida com uma sequência aleatória. Em geral, tomamos polinômios da forma f(x) = x2 + c com c 6= 0 ou c 6= −2. Na prática, a escolha de polinômios dessa forma, minimiza o número de operações executada pelo algoritmo. A complexidade deste algoritmo é estimada em O(n1/4). Este algoritmo torna-se eficiente para determinar o expoente de decodificação do RSA a partir da chave pública quando aquele tem menos do que 160 bits [24, §8.2.2 Security of RSA, note (iv)]. 4.4 ρ− 1-Método de Pollard Este outro método de Pollard [10, 30] em alguns aspectos é similar ao método anterior. O método ρ − 1 de fatoração é eficiente quando o número a ser fatorado possui um fator primo p cujo número p− 1 possui um fator pequeno (< 104). A idéia empregada nesse método tem como base o Teorema 2.0.1. Seja p um fator primo (ainda não conhecido) de n ≥ 2. Obviamente p − 1 é composto. Restringiremos nossa atenção aos números n tais que (p − 1)|L! (L um inteiro positivo qualquer < 105). Observamos que o número L! contém todos os primos positivos menores do que L. Como p é primo, então cp−1 ≡ 1 (mod p) quando mdc(c, n) = 1. Calculamos m = cL! (mod n). Para isso aplicamos um algoritmo de exponenciação modular [7]. Sendo L! = (p − 1)j, então m ≡ 1 (mod p). Logo, p|(m − 1). As chances de n não dividir m − 1 são excelentes. Neste caso, o mdc(m − 1, n) será um fator não trivial 58 de n. Caso o mdc(m− 1, n) = n, escolhemos um outro valor para a base c. Uma das razões para a restrição para que p−1 e q−1 não tenham fatores pequenos na escolha dos primos p e q como chave do RSA, é que com o algoritmo ρ − 1 de Pollard, o sistema fica vunerável. 4.5 Crivo Quadrático Um dos mais poderosos métodos de fatoração conhecidos é o Crivo Quadrático [10, 30]. Apesar de ser um dos melhores algoritmos existentes para fatoração (isto não significa que possa realmente fatorar um número composto grande), existem apenas estimativas com relação ao seu desempenho. Este método tem como técnica uma abordagem similar à que foi feita no método de Fermat. No lugar de procurar x e y que satisfazem n = x2 − y2, procuramos encontrar aleatoriamente x e y que satisfazem x2 ≡ y2 (mod n). Encontrar tal par (x, y) não significa que encontramos uma fatoração de n, mas significa que n divide x2 − y2 = (x − y)(x + y). As chances são de pelo menos 50-50 para que os primos divisores de n estejam distribúıdos entre os divisores de ambos os fatores (x − y) e (x + y). Assim, d = mdc(x− y, n) será um fator não trivial de n. A complexidade para o crivo quadrático fatorar um número n, não rigorosamente provada, é dada por e(1+o(1)) √ log n log log n [27]. Portanto, para n muito grande o trabalho executado por uma implementação do método cresce exponencialmente, o que torna a fatoração de n muito grande impraticável. 59 Conclusão No presente trabalho buscamos apresentar o RSA e alguns resultados da Teoria dos Números relacionados ao RSA. Com este objetivo consideramos o problema de gerar primos aleatoriamente e de fatorar inteiros grandes. Com relação à geração de números primos, apresentamos alguns algoritmos para testar a primalidade de números de forma genérica. Dois dos algoritmos apresenta- dos são probabiĺısticos, o Solovay-Strassen e o Miller-Rabin, ambos com complexidade O(lg3n). Também apresentamos um algoritmo determińıstico, o AKS, que foi recen- temente descoberto e que tem complexidade O(lg19n). Comparando os testes de primalidade probabiĺısticos, o uso do algoritmo de Miller- Rabin apresenta pelo menos duas vantagens em relação ao de Solovay-Strassen: O algoritmo de Miller-Rabin é de implementação mais simples, uma vez que o outro algoritmo exige o cálculo do śımbolo de Jacobi. Além disso, a probabilidade de erro é limitada por 1 4 enquanto que para o algoritmo de Solovay- Strassen a probabilidade de erro é limitada por 1 2 . A descoberta do AKS é de grande relevância matemática, pois como consequência prova que o
Compartilhar