UM ESTUDO TEÓRICO E COMPUTACIONAL DO CRIPTOSISTEMA DE CHAVE PÚBLICA RSA Lilian Berton (IC-Voluntária), Marlon Soares (Orientador), e-mail: [email protected] Palavras-chave: Criptografia, criptosistema RSA, teoria dos números Resumo: Este trabalho trata do criptosistema de chave pública RSA sob dois enfoques. Um deles teórico, a partir do estudo dos conceitos e resultados da Álgebra Abstrata aplicados ao criptosistema, e outro computacional, que resultou na sua implementação. Introdução A criptografia, cujo termo vem do Grego kryptós, “escondido”, e gráphein, “escrita”, trata do estudo de conceitos e técnicas que visam a codificação de uma informação, ou seja, a transformação desta para uma forma ilegível. O processo inverso da codificação é denominado decodificação, sendo que, em geral, para cada um deles é necessária uma função conhecida por chave. Os algoritmos de codificaçãodecodificação, juntamente com as mensagens a serem codificadas, as chaves e o texto codificado formam o que é conhecido por criptosistema. A utilização de redes de computadores, em especial o surgimento da Internet, tornou necessária a criação de novos sistemas criptológicos denominados criptosistemas de chave pública. Tais criptosistemas, diferentemente dos clássicos, usam uma chave de codificação pública que pode ser livremente divulgada, sem comprometer a segurança dos dados ou da chave privada de decodificação. Dentre os criptosistemas que usam chave pública o mais conhecido é o RSA, proposto em 1978 por R. L. Rivest, A. Shamir e L. Adleman, cuja segurança baseia-se na extrema dificuldade computacional em fatorar números grandes como um produto de números primos. Neste trabalho é feito um estudo aprofundado deste criptosistema, envolvendo as teorias matemáticas que o fundamentam e a sua implementação. Materiais e Métodos Inicialmente o trabalho foi desenvolvido com base em [4] e [5], sendo estudados os principais conceitos e resultados de Álgebra Linear. Tal estudo teve por objetivo aprofundar os conhecimentos necessários para ingressar num programa de pósgraduação em Matemática ou áreas afins. Num segundo momento, com base em [2], [3] e [7], foram estudados vários tópicos da Álgebra Abstrata, principalmente da Teoria dos Números. Nesta etapa, dentre os conceitos e propriedades estudados, destacam-se: os conceitos de divisibilidade, congruência módulo n e primalidade; o Teorema de Fermat e o Teorema do Resto Chinês; as propriedades dos anéis Zn e da função de Euler. Posteriormente, respaldados em [1] e [2], foi estudado e implementado o criptosistema de chave pública RSA, descrito teoricamente por Rivest, Shamir e Adleman, em [6]. Resultados e Discussão O criptosistema de chave pública RSA consiste basicamente do seguinte. Após calcular (n), onde n = pq, com p e q primos, escolhe-se um número natural e, tal que e (n) e mdc(e, (n)) = 1, e determina-se um número natural d satisfazendo a congruência ed 1 mod (n). A chave pública será o par (n,e) e a chave privada será o par (n,d). Assim, dada uma mensagem T, obtém-se sua codificação C pela relação C = Te mod n. Por sua vez, dada uma mensagem codificada C, obtém-se a mensagem T que a originou pela relação T = Cd mod n. No que segue mostraremos a validação teórica do RSA, ou seja, que dada uma mensagem T, onde T é um número natural, e as chaves (n,e) e (n,d), tem-se Ted T mod n, onde ed 1 mod (n). De fato, haja vista que ed 1 mod (n) temos, da definição de congruência módulo n, que (n)| (ed – 1). Então, pela definição de divisibilidade, existe um inteiro k tal que ed – 1 = k(n) ou, como p e q são primos, que ed = 1+k(p – 1)(q – 1). Assim, obtemos que Ted T 1+k(p–1)(q–1) mod p, ou seja, que Ted T(Tp–1)k(q–1) mod p. Se a classe residual módulo p gerada por T for invertível em Zp, como p é primo temos, pelo Teorema de Fermat, que Tp–1 1 mod p, assim Ted T(1)k(q–1) mod p e, portanto, Ted T mod p. De forma análoga prova-se que Ted T mod q e então, de uma conseqüência do Teorema do Resto Chinês, que Ted T mod n. Com relação à implementação do RSA utilizou-se a linguagem de programação Java Standard Edition, versão 5.0 e a ferramenta BlueJ, versão 2.1.3. Como a segurança do RSA baseia-se na extrema dificuldade em fatorar números grandes como um produto de números primos, as chaves (n,e) e (n,d) devem ser tais que n tenha muitos dígitos (na prática, os primos que geram n têm mais de 100 dígitos cada). Todavia, as principais dificuldades encontradas foram com relação a isto, mais precisamente, encontrar uma biblioteca que armazenasse números grandes. Após várias pesquisas optou-se por trabalhar com a Big Integer. Ressaltamos que, mesmo possibilitando trabalhar com números grandes, como o tempo de processamento torna-se muito alto, quando da inserção de números grandes, nos exemplos testados utilizou-se números primos com até 8 dígitos. No RSA, bem como em outros métodos de codificação-decodificação, os caracteres utilizados na mensagem criptografada devem ser convertidos em números, sendo que a tabela mais utilizada para essa conversão é o código ASCII. Todavia, percebeu-se, durante a fase de testes, que o uso de uma única tabela poderia gerar um padrão de codificação e, por conseguinte, a decodificação da mensagem criptografada. Assim, a implementação conta com três tabelas distintas, que são sorteadas aleatoriamente. Apesar de não constar nos objetivos iniciais, considerou-se também o problema de determinar se um número é primo, e foram estudados alguns testes de primalidade, dando ênfase ao teste de Miller-Rabin. Embora este teste seja probabilístico, com a probabilidade de um número composto ser declarado primo, usando k números de teste, de, no máximo, 1/4k, como sua execução é em tempo polinomial é possível aplicá-lo várias vezes, diminuindo consideravelmente a margem de erro. No que segue será apresentado um dos exemplos testados após a implementação. Exemplo: Tomando os números primos p = 27795571 e q = 33333331 obtemos n = pq = 926518968477001. Assim, (n) = 27795570 * 33333330 = 926518907348100 e, como a chave codificadora deve ser tal que tal que e (n) e mdc(e, (n)) = 1, toma-se e = 7 e, então, a chave codificadora será (n,e) = (926518968477001, 7). Como d deve ser tal que ed 1 mod (n), toma-se d = 264719687813743 e, então, a chave decodificadora será (n,d) = (926518968477001, 264719687813743). A seguir é inserida uma mensagem, por exemplo: “Numero primo”, cada letra é transformada em um número decimal correspondente em uma tabela sorteada aleatoriamente e a mensagem será transformada nos números correspondentes. Codificando a mensagem que foi transformada em números decimais de acordo com uma das tabelas obtém-se: 5567548918437623479278222169653287586016550339731085609199627136050 9896275944673024910091072135352107012287679245496169826056973516819 626653205121917565568854912594467302491009 Decodificando-a obtém-se novamente a mensagem original: “Numero primo”. Conclusões Durante o desenvolvimento do projeto foi possível perceber que o algoritmo usado para descrever o criptosistema RSA é essencialmente simples. Todavia, a sua validação teórica envolve conceitos algébricos não-triviais como, por exemplo, as propriedades dos anéis Zn, e na sua implementação surgem alguns problemas como a dificuldade em trabalhar computacionalmente com a aritmética modular. Além disso, o trabalho foi muito importante, pois possibilitou, dentre outras coisas, aprofundar os conhecimentos teóricos em Álgebra Linear e Álgebra Abstrata, estabelecer a relação entre determinados conceitos matemáticos e sua aplicação computacional (mais precisamente uma aplicação da Álgebra à Computação), conhecer uma aplicação prática do conceito de números primos e trabalhar com a biblioteca Big Integer. Referências [1] COUTINHO, S. C. Números Inteiros e Criptografia RSA. Edição 2ª, IMPA, 2000. [2] EVARISTO, J. PERDIGÃO, E. Introdução à Álgebra Abstrata. EDUFAL, 2002. [3] HEFEZ, A. Curso de Álgebra. Volume 1, IMPA, 1983. [4] KOLMAN, R. Introdução à Álgebra Linear com Aplicações. Edição 6ª, PrenticeHall do Brasil, 1996. [5] LIMA, E. L. Álgebra Linear. Edição 3ª. IMPA, 1999. [6] RIVEST, R. L. SHAMIR, A. ADLEMAN, L. A Method for Obtaining Digital Signatures and Public Key Cryptosystems, volume 21, Communications of the ACM, p. 120-126, 1978. [7] SANTOS, J. P. Introdução à Teoria dos Números, IMPA, 2003.