FUNDAÇÃO GETÚLIO VARGAS TRABALHO DE CONCLUSÃO DE CURSO Criptografia com Curvas Elípticas Autor: Camilla SILVA Supervisor: Luciano CASTRO Um trabalho de Conclusão de Curso que é requerido para a Graduação em Matemática Aplicada na Escola de Matemática Aplicada 21 de Dezembro de 2015
Declaração do Autor Eu, Camilla SILVA, declaro que este trabalho de conclusão de curso, cujo título é "Criptografia com Curvas Elípticas"e todo o trabalho apresentado nele é de minha autoria. Eu confirmo que: O trabalho for realizado em sua totalidade enquanto me graduava no curso de Matemática Aplicada. Onde consultei os trabalhos publicados por outros, o crédito foi claramente atribuído na Bibliografia. Assinatura: Data: i
Pure mathematics is, in its way, the poetry of logical ideas. Albert Einstein ii
FUNDAÇÃO GETÚLIO VARGAS Resumo Escola de Matemática Aplicada Graduação em Matemática Aplicada Criptografia com Curvas Elípticas Camilla SILVA O objetivo deste trabalho é apresentar técnicas de criptografia que utilizam Curvas Elípticas, desenvolver seus algoritmos e compará-los em rendimento com a técnica do RSA que é muito utilizada nos dias atuais, e também será apresentada no desenvolvimento do documento. iii
Conteúdo Declaração do Autor Resumo i iii 1 Introdução 1 2 A Criptografia RSA 3 2.1 O método RSA de criptografia..................... 3 2.1.1 Criação das chaves....................... 3 2.1.2 Encriptação........................... 4 2.1.3 Desencriptação......................... 4 2.1.4 Problema do método...................... 4 3 Curvas Elípticas 5 3.1 O que são?................................ 5 3.1.1 Condições para as constantes................. 6 Garantir a não auto-interseção................ 6 Garantir a ausência de cúspides............... 6 O que são Grupos........................ 7 O que são Corpos........................ 8 A necessidade do ponto O................... 8 3.1.2 Definindo a operação sobre os pontos da curva elíptica (C)................................ 9 Elemento simétrico....................... 9 Operação para dois pontos distintos............. 9 Operação entre dois pontos iguais.............. 11 Multiplicação de um ponto por um escalar natural.... 12 Subgrupos e suas propriedades................ 12 3.1.3 Códigos para as operações.................. 12 Código para garantir a existência da curva......... 12 Código para verificar se pontos são simétricos....... 13 Código para realizar a operação.............. 13 iv
Código para a multiplicação de um ponto por um escalar 14 4 Algoritmos de Criptografia com Curvas Elípticas 15 4.1 Diffie Hellman............................. 15 4.1.1 O porquê da força....................... 16 4.2 Um outro método usando curvas elípticas.............. 17 Encriptando uma mensagem................. 17 Descriptografando a mensagem............... 18 4.2.1 O porquê da fórmula para descriptografar funcionar... 18 4.2.2 Exemplo............................. 18 Códigos para o problema criptografar e descriptografar. 20 A força do algoritmo...................... 22 5 Conclusão 23 A A classe de problemas NP 25 A.1 Fatorar Números............................ 25 A.2 O problema do Logaritmo Discreto.................. 27 Bibliografia 28 v
Lista de Figuras 3.1 Exemplos de curvas elípticas..................... 5 3.2 Cúspide na curva y 2 = x 3....................... 7 3.3 Posição do ponto O em uma curva elíptica............. 9 3.4 Representação geométrica de ponto simétrico............ 10 3.5 A B = C................................ 10 3.6 A A = 2A............................... 11 4.1 Esquema para o algoritmo de Diffie-Hellman............ 16 4.2 Tabela de consulta para exemplo................... 19 5.1 Tabela comparativa entre RSA e Curvas Elípticas.......... 23 vi
Capítulo 1 Introdução A criptografia é definida pelo dicionário como Arte de escrever secretamente por meio de abreviaturas ou de sinais convencionados entre duas ou mais pessoas ou partes. Codificação de um artigo ou outra informação armazenada num computador, para que só possa ser lido por quem detenha a senha de sua decodificação. [2] Uma das primeiras máquinas conhecidas para o desenvolvimento da criptografia foi a Enigma, criada por Dr. Arthur Scherbius no ínicio do século XX. A máquina mantinha grande similaridade com máquinas de escrever, e se baseava em tabelas distribuídas mensalmente para criar o código necessário para encriptografar os dados. Durante as primeiras décadas do século XX, algumas outras versões da Enigma foram desenvolvidas, entre elas a Enigma G, que foi utilizada pelos alemães durante a segunda guerra mundial. A necessidade das técnicas de criptografia se dá pelo fato de que nem todas as informações devem ser públicas (como por exemplo as rotas de ataques de aviões durante a segunda guerra). Com o desenvolvimento rápido dos computadores nas últimas décadas, algumas formas de criptografia foram mais evidenciadas pelo maior rendimento e maior capacidade de manter os dados secretos. Neste trabalho abordaremos dois tipos fundamentais de criptografia utilizadas nos dias de hoje [3]: Criptografia com chaves simétricas; Criptografia com chaves assimétricas. A Criptografia com chaves simétricas consiste em criar um canal conhecido apenas pelas pessoas que vão partilhar a informação. Esse canal é formado com uma chave única que é compartilhada pelos indivíduos ou empresas que querem manter a comunicação privada. É possível usar métodos matemáticos 1
Capítulo 1. Introdução 2 para essa chave ser compartilhada de forma que fontes externas não consigam descobri-la. A Criptografia com chaves assimétricas também é conhecida como criptografia de chave pública, ela consiste no uso de duas chaves: uma pública e uma privada. Essa criptografia é baseada também em métodos matemáticos na criação das chaves, que utilizam operações difíceis de serem invertidas computacionalmente. A chave pública é conhecida por todos e é usada para criptografar a mensagem que é crida pela pessoa que quer passar a informação. Essa informação, por sua vez, só pode ser descriptografada por quem possui a chave privada. No desenvolvimento do trabalho serão analisados algoritmos que usam as duas formas de criptografia supracitadas, usando o método RSA e o método das curvas elípticas.
Capítulo 2 A Criptografia RSA RSA é um algoritmo de criptografia que utiliza chaves assimétricas, criado por Ron Rivest, Adi Shamir and Len Adleman em 1973. O algoritmo usa um fato conhecido na matemática: a dificuldade em fatorar números com fatores primos muito grandes. [1] 2.1 O método RSA de criptografia O método RSA é realizado da seguinte forma: 2.1.1 Criação das chaves 1. Escolha aleatoriamente dois primos grandes distintos (ordem de 10 306 ): p e q; 2. Faça n = pq; 3. Encontre φ(n) = (p 1)(q 1); 4. Escolha um número inteiro e, de tal forma que 1 < e < φ(n), e mdc(e, φ(n)) = 1; 5. Encontre d, o inverso de e mod(φ(n)) Temos assim: Chave pública = (n, e) Chave privada = (n, d) 3
Capítulo 2. A Criptografia RSA 4 2.1.2 Encriptação Sendo m a mensagem a ser passada (já convertida para a forma numérica), calculamos: C m e (mod n) Assim, temos nossa mensagem criptografada C. 2.1.3 Desencriptação O receptor possui a chave privada. Com essa chave, é possível calcular m C d (mod n) e encontrar a mensagem original. Vamos verificar abaixo que a mensagem m é realmente dada pela conta proposta, ou seja, vamos demonstrar que m C d (mod n). É necessário escolher m < min{p, q}. Caso a mensagem a ser passada seja maior que min{p, q} ela deverá ser dividida em partes. Demonstração. Basta mostrar que C d (m e ) d m(mod n). Como sabemos que ed 1(modφ(n)), podemos escrever ed = kφ(n) + 1, k Z. Assim, m ed = m kφ(n) m. Como (mdc(m, n) = 1), pelo teorema de Euler-Fermat, m φ(n) 1(mod n). Com isso, temos que m kφ(n) m m(mod n) e, consequentemente: C d m(mod n). 2.1.4 Problema do método Caso seja possível encontrar φ(n), é fácil encontrar um inverso de e(mod φ(n)), com tempo de execução O(log φ(n)). Com isso, para ser difícil encontrar o φ(n), a fatoração de n deve ser difícil, assim devemos usar primos grandes, já que o algoritmo de fatoração é NP. Uma outra forma de abordar a quebra da criptografia, seria tentar encontrar o φ(n) sem fatorar o n. Mas se isso fosse possível em tempo polinomial, seria também possível fatorar os números em tempo polinomial: Como φ(n) = (p 1)(q 1) = pq + p + q + 1 = n + p + q + 1, teríamos: p + q = φ(n) n 1 pq = n. Como não é conhecido nenhum algoritmo em tempo polinomial para a fatoração de números, também não existe para encontrar o φ.
Capítulo 3 Curvas Elípticas 3.1 O que são? Curvas Elípticas são curvas algébricas no plano cartesiano, cujas equações são da forma: y 2 = x 3 + ax + b. Como por exemplo os gráficos da Figura 3.1. [7] As Curvas Elípticas devem ser (a) a = 1, b = 5 (b) a = 1, b = 2 (c) a = 1, b = 0 (d) a = 1, b = 1 FIGURA 3.1: Exemplos de curvas elípticas não-singulares, ou seja, não deve existir auto-interseção nem cúspides. 5
Capítulo 3. Curvas Elípticas 6 3.1.1 Condições para as constantes Para assegurar o fato de que a curva deve ser não singular, é necessário encontrar as condições para a e b em R. Garantir a não auto-interseção Para isso, parametrizamos a função por partes, considerando, separadamente, y > 0 e y 0. Para y > 0: x = t y = t 3 + at + b E para y 0: x = t y = t 3 + at + b É fácil perceber que para haver auto-interseção devemos ter y = 0, pois, para y 0 cada uma das definições paramétricas é uma função, e de sinais distintos. Com isso, é necessário saber se há algum valor de t que é raiz dupla da equação que define t. Suponha que exista um valor x 0 que satisfaz o pedido. Com isso: x 3 0 + ax 0 + b = 0 3x 2 0 + a = 0 Resolvendo o sistema encontramos x 0 = 3b, e substituindo na segunda equação, chegamos a 27b 2 + 4a 3 = 0. Esta é a condição para que a curva tenha 2a auto-interseção. Como queremos que não exista essa auto-interseção, precisamos que: 27b 2 + 4a 3 0 Garantir a ausência de cúspides Uma cúspide é um ponto em que há um "bico"na função, como na Figura 3.2. Para a cúspide existir em uma curva definida implicitamente por f(x, y) = 0, é
Capítulo 3. Curvas Elípticas 7 FIGURA 3.2: Cúspide na curva y 2 = x 3 necessário e suficiente que: δf δx (x 0, y 0 ) = 0 δf δy (x 0, y 0 ) = 0 Assim, podemos escrever a curva elíptica como as raízes de: f(x, y) = x 3 + ax + b y 2 Temos: δf δx (x 0, y 0 ) = 3x 2 0 + a = 0 δf δy (x 0, y 0 ) = 2y 0 = 0 Como (x 0, y 0 ) deve pertencer à Curva Elíptica, chegamos a contas similares às do outro caso, e chegamos novamente à conclusão de que, para não haver cúspides: 27b 2 + 4a 3 0. O que são Grupos Um grupo é uma estrutura algébrica formada por um conjunto de elementos (G) e uma operação ( : G G G). Podemos expressar o grupo como (G, ). Propriedades de grupos:
Capítulo 3. Curvas Elípticas 8 Fechado com relação a : u, v G (u v) G Associatividade : u, v, w G u (v w) = (u v) w Existência do elemento neutro: u G, o G u o = o u = u Existência do elemento simétrico: u G, u G u u = u u = o O que são Corpos Corpos são conjuntos nos quais as operações de soma, multiplicação, subtração e divisão (por não nulo) estão definidas. Valem nessas operações as propriedades já conhecidas destas operações, como a comutatividade da adição e da multiplicação. Um Corpo Finito é um corpo com um número finito de elementos. [8] As propriedades de grupos sobre os pontos de uma curva elíptica são válidas se trabalharmos sobre qualquer corpo. Para fins de criptografia trabalharemos sobre o conjunto dos inteiros módulo p (primo) (Z p ), e as operações definidas serão neste contexto. Os pontos das Curvas Elípticas em Z p são grupos abelianos. O grupo é abeliano quando, ademais, a operação tem propriedade comutativa: u, v G u v = u v. A necessidade do ponto O Para satisfazer as propriedades de grupos sobre os pontos da curva, é necessário adicionar um novo ponto na curva, que será o elemento neutro. A posição desse elemento neutro foi determinada usando Geometria Projetiva, e ele está localizado no infinito em todas as verticais possíveis que passam pela curva, como na Figura 3.3.
Capítulo 3. Curvas Elípticas 9 FIGURA 3.3: Posição do ponto O em uma curva elíptica 3.1.2 Definindo a operação sobre os pontos da curva elíptica (C) Elemento simétrico Definimos o elemento simétrico como o simétrico em relação à reta y = 0, ou seja: se P = (x P, y P ) é um ponto da curva C, seu simétrico será P = P = (x P, y P ). Operação para dois pontos distintos Aqui definiremos a operação necessária para para verificarmos as propriedades de grupos sobre os pontos da curva. Se A e B são dois pontos distintos da curva, definimos resposta da operação A B como simétrico do terceiro ponto de interseção da reta AB com a curva, como na Figura 3.5. Sejam A = (x A, y A ) e B = (x B, y B ), onde as coordenadas de ambos os pontos são inteiras, para encontrar o ponto A B = C,consideramos inicialmente a reta y = mx + n que passa por A e B (m = y B y A x B x A e n = y A mx A ). Para encontrar C =
Capítulo 3. Curvas Elípticas 10 FIGURA 3.4: Representação geométrica de ponto simétrico FIGURA 3.5: A B = C (x ( C), y ( C) ), precisamos resolver o sistema: y 2 = x 3 + ax + b y = mx + n Temos então: (mx + n) 2 = x 3 + ax + b
Capítulo 3. Curvas Elípticas 11 x 3 m 2 x 2 + (a 2mn)x + b n = 0 Usando relações de Girard, encontramos m 2 = x A + x B + x C x ( C) = m 2 x A x B e substituindo essa informação na segunda equação do sistema, temos: y ( C) = m(m 2 x A x B ) + n. Como C = (x ( C), y ( C) ), temos: A B = C (x A, y A ) (x B, y B ) = (m 2 x A x B, m(m 2 x A x B ) n) Caso ambos os pontos A e B estejam na mesma vertical, queremos realizar a operação A A, como são simétricos, o resultado da operação é O. É possível perceber isso também geometricamente, pois não há outra interseção da reta vertical com C. A propriedade da associatividade em curvas elípticas tem uma demonstração que não cabe no escopo deste trabalho, e pode ser encontrada em [4]. As demais propriedades são simples de demonstrar. Operação entre dois pontos iguais Para realizar a operação A A, é necessário considerar que em A B temos B A, o que implica o uso da reta tangente passando por A. Nesse caso, encontramos a reta tangente por A: y = mx + n, com m = 3x2 A + a 2y A (se y A 0), e n = y A mx a. E podemos encontrar assim, analogamente ao item anterior: A A = (x A, y A ) (x A, y A ) = (m 2 2x A, m(m 2 2x A ) n). Caso y A = 0, temos que A = A, e, com isso, sua soma é O. FIGURA 3.6: A A = 2A
Capítulo 3. Curvas Elípticas 12 Multiplicação de um ponto por um escalar natural Usando as definições anteriores, é possível construir a operação αp, onde α N e P C. Subgrupos e suas propriedades αp = P P P }{{} α termos Um subgrupo de G é um grupo que está contido em G e possui um elemento gerador, que chamaremos de g. Esse elemento, como mostra o nome, é capaz de gerar todos os elementos do subgrupo analisado. Seja S G o subgrupo, temos: g S G ; α N, αg S G ; α N αg = O Chamamos de ordem de S C o menor número natural n tal que ng = O. 3.1.3 Códigos para as operações Nesta seção utilizaremos o software P ython para definir as funções necessárias para analisar a criptografia usando curvas elípticas. Trabalharemos, então com o corpo finito Z p onde p é um número primo. Código para garantir a existência da curva Dada uma curva com parâmetros a e b, a função existence_curve retorna True se a curva e elíptica, e False caso contrário. 1 def e x istence_curve ( a, b ) : 2 x = 27 a^2 + 4 a^3 3 i f x == 0 : 4 return F a l s e 5 e l s e : 6 return True
Capítulo 3. Curvas Elípticas 13 Código para verificar se pontos são simétricos A função issim verifica se os pontos A e B são simétricos em uma curva de parâmetros a e b trabalhada módulo p, e a função simetrico retorna o simétrico de A em uma curva de parâmetros também dados: 1 def issim (A, B, p ) : 2 i f A =="O" and B =="O" : 3 return True 4 e l i f A =="O" or B == "O" : 5 return F a l s e 6 i f A[0]==B [ 0 ] and A[ 1 ]! = B [ 1 ] and A[1]%p == B[1]%p : 7 return True 8 e l s e : 9 return F a l s e 10 11 def s i m e t r i c o ( a, b, p,a) : 12 i f A!= "O" : 13 return (A[ 0 ], A[1]%p ) 14 i f A == "O" : 15 return A Código para realizar a operação A função oper retorna a A B (com A B) sobre a curva de parâmetros a e b, trabalhada módulo p. Para usá-la, foi necessária a construção de duas funções auxiliares: egcd que calcula o mdc entre dois números, e modinv que calcula o inverso de a módulo m (usando o Algoritmo de Euclides - para isso foi necessário usar o mdc). 1 def egcd ( a, b ) : 2 i f a == 0 : 3 return ( b, 0, 1) 4 e l s e : 5 g, y, x = egcd ( b % a, a ) 6 return ( g, x ( b // a ) y, y ) 7 8 def modinv ( a, m) : 9 g, x, y = egcd ( a%m, m) 10 i f g!= 1 : 11 r a i s e Exception ( Nao e x i s t e o inverso ) 12 e l s e : 13 return x % m 14 15 def oper ( a, b, A, B, p ) :
Capítulo 3. Curvas Elípticas 14 16 i f A == "O" : 17 return B 18 e l i f B=="O" : 19 return A 20 e l s e : 21 x_a = A[0]%p 22 y_a = A[1]%p 23 x_b = B[0]%p 24 y_b = B[1]%p 25 i f issim (A, B, p ) : 26 return "O" 27 e l i f A == B : 28 m = ( ( 3 pow( x_a, 2, p ) +a%p ) modinv (2 y_a, p ) )%p 29 n = ( y_a m x_a )%p 30 e l i f A!=B : 31 m = ( ( y_a y_b )%p modinv ( x_a x_b, p ) )%p 32 n = ( y_a m x_a )%p 33 return ( ( pow(m, 2, p ) x_a x_b )%p, ( m (m 2 x_a x_b ) n )%p ) Código para a multiplicação de um ponto por um escalar Para realizar a multiplicação de um ponto por um escalar de forma otimizada, usaremos a representação binária do escalar para diminuir o tempo do algoritmo. Por exemplo para realizar a operação 13A, faremos: 13A = 2 3 A 2 2 A A. Para otimizar o código foi necessário criar a função dobrar que recebe os parâmetros da curva, o ponto A e um número num e retorna 2 num A. Com isso foi possível construir a função mult que recebe como argumentos os parâmetros da curva a e b, o número x o ponto A e o módulo p trabalhado, e retorna xa na curva escolhida. 1 def dobrar ( a, b, p,a,num) : 2 while num> 0: 3 A = oper ( a, b,a,a, p ) 4 num =1 5 return A 6 7 def mult ( a, b, x, A, p ) : 8 x = bin ( x ) [ 2 : ] 9 ans = "O" 10 f o r i in range ( len ( x ) ) : 11 i f x [ i ] ==" 1 " : 12 ans = oper ( a, b, ans, dobrar ( a, b, p,a, len ( x ) 1 i ), p ) 13 return ans
Capítulo 4 Algoritmos de Criptografia com Curvas Elípticas Para abordar a criptografia com curvas elípticas, trabalharemos em Z p, ou seja, reduziremos as coordenadas dos pontos a módulo p primo. 4.1 Diffie Hellman O algoritmo Diffie-Hellman para curvas elípticas consiste em criar um canal para a comunicação entre duas partes.[5] A Chave pública é da forma (p, a, b, G, n), onde: p é o primo usado para redução de módulo; a e b são os parâmetros para a formação da curva elíptica no formato y 2 = x 3 + ax + b; G é um ponto gerador da curva; n a ordem da curva; Suponha que duas pessoas distintas, Alice e Bob querem criar um canal para comunicação: Para a criação do canal entre ambas as partes, o seguinte procedimento deve ser seguido: Ana deve: 1. Escolher de um número entre 1 e n 1: α; 2. Computar A = αg; 3. Enviar A para Bob. E Bob deve: 15
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 16 1. Escolher de um número entre 1 e n 1: β; 2. Computar B = βg; 3. Enviar B para Ana. Depois dos passos anteriores, cada um deles tem a capacidade de computar o mesmo ponto P = αβp = βαp, e o canal assim está criado. FIGURA 4.1: Esquema para o algoritmo de Diffie-Hellman 4.1.1 O porquê da força De uma forma geral os parâmetros escolhidos para a curva e o primo escolhidos para usar a o algoritmo de Diffie-Hellman são números grandes, como por exemplo os parâmetros usados pela Microsoft: p = 785963102379428822376694789446897396207498568951 a = 317689081251325503476317476413827693272746955927 b = 79052896607878758718120572025718535432100651934 G x = 771507216262649826170648268565579889907769254176 G y = 390157510246556628525279459266514995562533196655 n = 785963102379428822376693024881714957612686157429 A força do algoritmo se dá pelo fato de que uma pessoa que queira descobrir o valor P, deve descobrir ou o α ou o β, ou seja: Sabendo αg e G é possível encontrar o valor de α?
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 17 Esse problema é tratado em algoritmos como o problema do Logaritmo Discreto, que consiste em encontrar o valor de x tal que xg = P, onde conhecemos G e P que pertencem a um grupo cíclico finito. 4.2 Um outro método usando curvas elípticas Um outro método possível de se comunicar usando curvas elípticas - e usando chaves assimétricas - será descrito abaixo: [6] Suponha que duas pessoas - Ana e Bob - querem se comunicar, para isso eles precisam escolher uma curva elíptica y 2 = x 3 + ax + b, um número primo p, e um ponto pertencente a curva C. Ana deve: 1. Escolher α menor que a ordem da curva, e um ponto da curva A; 2. Gerar A 1 = α(c A), e A 2 = αa; 3. Publicar A 1 e A 2 como chave pública; E o Bob, analogamente, deve: 1. Escolher β menor que a ordem da curva, e um ponto da curva A; 2. Gerar B 1 = β(c B), e B 2 = βb; 3. Publicar B 1 e B 2 como chave pública; Depois disso, a Ana é capaz de calcular A B = αb 2, que será a será também publicada como chave pública, mas específica para Bob. E o Bob faz o mesmo: calcula B A = βa 2 e publica com chave pública específica para Ana. Com isso, é possível encriptar a mensagem. Encriptando uma mensagem Para codificar a mensagem, é necessário atribuir a cada ponto da curva um caractere, de forma que com esses caracteres seja possível formar a mensagem que deve ser passada. Após criar essa relação entre pontos e caracteres, é possível mandar a mensagem da seguinte forma: Se Ana quer mandar a mensagem para Bob, ela deve, para cada caractere X: 1. Escolher um número qualquer γ aleatoriamente; 2. Computar X 1 = γc e X 2 = X (α + γ)b 1 γb 2 B 1 A ; 1 Como os pontos da curva satisfazem as propriedades de grupos em Z p : E 1 e E2 pertencem à curva.
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 18 3. Encontrar os caracteres correspondentes a X 1 e X 2 na tabela compartilhada x 1 e x 2 ; 4. Enviar (x 1, x 2 ) para Ana. Descriptografando a mensagem Para encontrar o caractere correspondente a cada X, Bob deve: 1. Encontrar os pontos X 1 e X 2 usando a tabela de correspondência com x 1 e x 2 ; 2. Encontrar a o caractere que quer ser passado com a seguinte fórmula X = X 2 (βx 1 βa 1 A B ). Com isso cada caractere da mensagem pode ser passado de forma segura. 4.2.1 O porquê da fórmula para descriptografar funcionar A mensagem X é gerada de tal forma que X = X 2 ((α + γ)b 1 γb 2 B A ). Com isso: X = X 2 ((α + γ)b 1 γb 2 B A ) X = X 2 (γ(b 1 B 2 ) αb 1 B A ) X = X 2 (γβc αb 1 B A ) X = X 2 (γβc αβ(c B) βαa) X = X 2 (βx 1 βα(a B C)) X = X 2 (βx 1 βα(c A) βαb X = X 2 (βx 1 βa 1 αb 2 ) X = X 2 (βx 1 βa 1 A B ) O que mostra que a fórmula de descriptografar realmente funciona. 4.2.2 Exemplo Para construir um exemplo, usaremos a curva: y 2 = x 3 + 2x + 5(mod31) Encontrando todos os pontos da curva, podemos construir a tabela que consta na Figura 4.2. A ordem do grupo é 42 e podemos escolher C = (30, 8). Com isso, Ana pode escolher: 1. A = (10, 23);
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 19 FIGURA 4.2: Tabela de consulta para exemplo 2. α = 13; 3. A 1 = α(c A) = (20, 4); 4. A 2 = αa = (10, 8). E Bob pode escolher: 1. B = (25, 5); 2. β = 9; 3. B 1 = β(c B) = (10, 23); 4. B 2 = βb = (24, 12). Assim, A B = αb 2 = (24, 19) e B A = βa 2 = (6, 27). Se a mensagem a ser passada de Ana para Bob é a letra m, por exemplo, o seguinte procedimento deve ser seguido: 1. Ela deve escolher um número qualquer γ = 241; 2. Encontrar o ponto da curva correspontente à letra m na tabela compartilhada : X = (10, 8); 3. Computar X 1 = γc = (5, 27) e X 2 = X (α + γ)b 1 γb 2 B A = (16, 17) 4. Calcular o par de letras referentes a X 1 ex 2 na tabela (h, u) e enviar esse par para Bob. Ao receber a o par (X 1, X 2 ), Bob deve:
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 20 1. Encontrar os pares X 1 = (5, 27) e X 2 = (16, 17) referentes a h e u, respectivamente, usando a tabela de referências compartilhada; 2. Calcular X = X 2 (βx 1 βa 1 A B ) = (10, 8); 3. Transformar X em um caractere usando a tabela de referências. Com isso, a mensagem é devidamente compartilhada. Códigos para o problema criptografar e descriptografar Para poder usar o Python para criptografar e descriptografar mensagens, é necessário primeiramente definir os parâmetros iniciais da curva e as escolhas de cada pessoa - para o exemplo acima, usamos os parêmetros: 1 t a b l e _ o f _ r e f e r e n c e s = { " " : "O", " a " : ( 0, 6 ), " b " : ( 0, 2 5 ), " c " : ( 1, 1 5 ), "d" : ( 1, 1 6 ), " e " : ( 3, 1 0 ), " f " : ( 3, 2 1 ), " g " : ( 5, 4 ), "h" : ( 5, 2 7 ), " i " : ( 6, 4 ), " j " : ( 6, 2 7 ), " k " : ( 9, 1 5 ), " l " : ( 9, 1 6 ), "m" : ( 1 0, 8 ), "n" : ( 1 0, 2 3 ), " o " : ( 1 1, 5 ), "p" : ( 1 1, 2 6 ), " q " : ( 1 4, 7 ), " r " : ( 1 4, 2 4 ), " s " : ( 1 5, 0 ), " t " : ( 1 6, 1 4 ), "u" : ( 1 6, 1 7 ), " v " : ( 1 8, 1 3 ), "w" : ( 1 8, 1 8 ), " x " : ( 1 9, 1 2 ), " y " : ( 1 9, 1 9 ), " z " : ( 2 0, 4 ), " : " : ( 2 0, 2 7 ), " ; " : ( 2 1, 1 5 ), " $ " : ( 2 1, 1 6 ), "%" : ( 2 2, 8 ), "@" : ( 2 2, 23), "&" : ( 2 3, 2 ), " ( " : ( 2 3, 2 9 ), " ) " : ( 2 4, 1 2 ), "+" : ( 2 4, 1 9 ), "=" : ( 2 5, 5 ), " " : ( 2 5, 2 6 ), " " : ( 2 6, 5 ), "? " : ( 2 6, 2 6 ), "! " : ( 3 0, 8 ), ". " : ( 3 0, 2 3 ) } 2 a=2 3 b=5 4 p=31 5 A= ( 1 0, 2 3 ) 6 alpha = 13 7 B= ( 2 5, 5 ) 8 beta = 9 9 C = ( 3 0, 8 ) 10 AmaisC = oper ( a, b,a, C, p ) 11 A1 = mult ( a, b, alpha, AmaisC, p ) 12 A2 = mult ( a, b, alpha, A, p ) 13 BmaisC = oper ( a, b, B, C, p ) 14 B1 = mult ( a, b, beta, BmaisC, p ) 15 B2 = mult ( a, b, beta, B, p ) 16 AB = mult ( a, b, alpha, B2, p ) 17 BA = mult ( a, b, beta, A2, p ) Podemos então definir as funções usadas: cript: Recebe os parâmetros da curva e de ambas as partes que querem se comunicar - exceto o beta(número escolhido pelo receptor da mensagem,
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 21 quem manda não tem esse dado), e um "caracter"para ser criptografado. E retorna um par de caracteres gerado pela criptografia; descript: Recebe além dos parâmetros, o par gerado pela função cript, e retorna o "caracter"que estava criptografado; cript_msg e descript_msg funcionam de forma a operar as funções anteriores para uma sequência de caracteres. 1 def c r i p t ( a, b, p, C, l e t r a, alpha, B1, B2, BA, t a b l e _ o f _ r e f e r e n c e s ) : 2 X = t a b l e _ o f _ r e f e r e n c e s [ l e t r a ] 3 gamma = random. randint ( 2, 3 p ) 4 E1 = mult ( a, b, gamma, C, p ) 5 u1 = mult ( a, b, ( alpha+gamma), B1, p ) 6 u2 = mult ( a, b, gamma, B2, p ) 7 u3 = s i m e t r i c o ( a, b, p, u2 ) 8 S1 = oper ( a, b, X, BA, p ) 9 S2 = oper ( a, b, S1, u1, p ) 10 S3 = oper ( a, b, S2, u3, p ) 11 E2= S3 12 f o r l e t r a, ponto in t a b l e _ o f _ r e f e r e n c e s. i t e r i t e m s ( ) : 13 i f ponto == E1 : 14 x1 = l e t r a 15 f o r l e t r a, ponto in t a b l e _ o f _ r e f e r e n c e s. i t e r i t e m s ( ) : 16 i f ponto == E2 : 17 x2 = l e t r a 18 return ( x1, x2 ) 19 20 21 def d e s c r i p t ( a, b, p, par, A1, AB, beta, t a b l e _ o f _ r e f e r e n c e s ) : 22 X1 = t a b l e _ o f _ r e f e r e n c e s [ par [ 0 ] ] 23 X2 = t a b l e _ o f _ r e f e r e n c e s [ par [ 1 ] ] 24 M1 = mult ( a, b, beta, X1, p ) 25 M2 = mult ( a, b, beta, A1, p ) 26 S1 = oper ( a, b, M1, M2, p ) 27 S2 = oper ( a, b, S1, AB, p ) 28 S22 = s i m e t r i c o ( a, b, p, S2 ) 29 X = oper ( a, b, S22, X2, p ) 30 f o r l e t r a, ponto in t a b l e _ o f _ r e f e r e n c e s. i t e r i t e m s ( ) : 31 i f ponto == X : 32 msg = l e t r a 33 return msg 34 35 def cript_msg ( a, b, p, C, mensagem, alpha, B1, B2, BA, t a b l e _ o f _ r e f e r e n c e s ) :
Capítulo 4. Algoritmos de Criptografia com Curvas Elípticas 22 36 l = [ ] 37 f o r i in mensagem : 38 l. append ( c r i p t ( a, b, p, C, i, alpha, B1, B2, BA, t a b l e _ o f _ r e f e r e n c e s ) ) 39 return l 40 41 def descript_msg ( a, b, p, list_msg, A1, AB, beta, t a b l e _ o f _ r e f e r e n c e s ) : 42 msg = " " 43 f o r i in list_msg : 44 msg = msg + d e s c r i p t ( a, b, p, i, A1, AB, beta, t a b l e _ o f _ r e f e r e n c e s ) 45 return msg A força do algoritmo A força desse outro método de criptografia se dá basicamente pelo mesmo motivo do "Diffie-Hellman". Como a única chave que ambos não possuem são α e β, uma pessoa que queira descobrir a mensagem passada deveria tentar descobrir o valor de uma dessas constantes, o que se resume ao problema do "logaritmo discreto"em curvas elípticas que se enquadra na categoria de problemas NP.
Capítulo 5 Conclusão Com a evolução rápida dos computadores atuais, novas técnicas de criptografia se sobressaem no campo da segurança. O RSA é mais usado atualmente pelas grandes empresas, mas a criptografia com curvas elípticas tem traçado sua importância pela menor necessidade de memória para criar chaves. A tabela da Figura 5.1 mostra uma comparação entre o tamanho de chave necessário para um mesmo nível de segurança. (Tabela retirada de nsa.gov/business/programs/elliptic_curve.shtml em 10/11/2015) FIGURA 5.1: Tabela comparativa entre RSA e Curvas Elípticas Apesar da vantagem sobre o método RSA em relação ao tamanho das chaves, há um problema iminente para ambos os métodos: o desenvolvimento de "computadores quânticos". Esses "novos computadores"não funcionam com bits como os computadores simples atuais, e sim com qubits, onde cada espaço de memória pode assumir 1, 0 ou ambos simultaneamente. O fato desses computadores estarem sendo desenvolvidos ao longo dos anos pode dificultar as maiores formas de criptografia que existem por conseguir resolver problemas 23
Capítulo 5. Conclusão 24 tratados como NP em um tempo muito menor do que computadores tradicionais, fazendo assim com que as chaves tenham que ser significantemente aumentadas. Com isso, podemos concluir estudos de novos métodos de criptografia serão muito requeridos durante os próximos anos, e estudos e desenvolvimentos de métodos já existentes terão importância considerável na segurança dos dados.
Apêndice A A classe de problemas NP A classe de problemas NP (tempo polinomial não determinístico) engloba os problemas que não são resolvíveis em tempo polinomial por computadores atuais. Dentro da classe de problemas NP, existe um conjunto de problemas chamado NP-completo. Os problemas desse conjunto têm uma característica que os diferencia dos outros problemas NP: Se um problema for resolvido em tempo polinomial, todos os problemas desse conjunto também terão solução em tempo polinomial. O problema de fatoração, assim como o problema do logaritmo discreto, são dois problemas da classe NP. Esse fato implica a dificuldade de solução "rápida"de ambos os problemas. A.1 Fatorar Números Existem muitos algoritmos para tentar fatorar um número, o mais ingênuo dentre eles é a "fatoração por tentativa". Esse método tenta fatorar o número n por todos os primos menores que n. O tempo computacional necessário para encontrar a fatoração é O(2 x 2 ), com x = número de dígitos de n em sua representação binária. Os códigos abaixo mostram uma forma de tentar fatorar um número por tentativa, o teste de Miller-Rabin determina com uma alta probabilidade se o número é primo ou não. E assim, é possível usar o algoritmo para fatoração: 1 import random 2 def g ( x, i, n ) : 3 # r e t o r n a r x (2 i )%n 4 k = x%n 5 f o r j in range ( i ) : 6 k = ( k k )%n 25
Apêndice A. A classe de problemas NP 26 7 return k 8 9 def m i l l e r _ r a b i n _ t e s t ( n ) : 10 i f n == 2 : 11 return " pseudoprimo " 12 e l i f n%2 ==0: 13 return " composto " 14 e l s e : 15 dn = n 1 16 s = 0 17 while dn%2 ==0: 18 s += 1 19 dn = dn/2 20 a = random. randint ( 2, n 1) 21 i f pow( a, dn, n ) ==1: 22 return " pseudoprimo " 23 e l s e : 24 u = F a l s e 25 f o r i in range ( 0, s ) : 26 i f u ==False : 27 i f g (pow( a, dn, n ), i, n ) == n 1: 28 u = True 29 e l s e : 30 u =False 31 i f u == True : 32 return " pseudoprimo " 33 i f u==false : 34 return " composto " 35 36 def f a t o r a c a o _ p o r _ t e n t a t i v a ( n ) : 37 i f n < 2 : 38 return [ ] 39 f a t o r e s = [ ] 40 f o r p in range ( 2, i n t ( n 0. 5 ) + 1) : 41 i f m i l l e r _ r a b i n _ t e s t ( p ) == " pseudoprimo " : 42 while n % p == 0 : 43 f a t o r e s. append ( p ) 44 n //= p 45 i f n > 1 : 46 f a t o r e s. append ( n ) 47 return f a t o r e s
Apêndice A. A classe de problemas NP 27 A.2 O problema do Logaritmo Discreto O problema do Logaritmo Discreto se resume a tentar descobrir o valor de α tal que αa = B, onde A e B são conhecidos e pertencem a um grupo cíclico finito. O algoritmo ingênuo para resolver esse problema seria tentar valores de α de uma forma crescente até descobri-lo, esse algoritmo seria de ordem O(n) onde n é o número de elementos do grupo, ou O(10 x ), onde x é o número de dígitos de n. Com isso seria um problema exponencial.
Bibliografia [1] S. Collier Coutinho. Números Inteiros e Criptografia RSA. IMPA. [2] Dicionário Português. Dez. de 2015. URL: http://dicionarioportugues. org/pt/criptografia. [3] W. Burr W. Polk M. Smid E. Barker W. Barker. «COMPUTER SECURITY». Em: NIST Special Publication 1.800-57 (jul. de 2012), pp. 35 37. URL: http: //csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf. [4] Nicolau C. Saldanha Eduardo Tengan Fabio E. Brochero Martinez Carlos Gustavo T. de A. Moreira. Teoria dos Números: um passeio com primos e outros familiares pelo mundo inteiro. IMPA. [5] N. Koblitz. A Course in Number Theory and Cryptography. Springer. [6] D. Sravanna Kumar, CH. Suneetha e A. ChandrasekhAR. «Encryption of Data using Elliptic Curve over finite fields». Em: International Journal of Distributed and Parallel Systems 3.1 (jan. de 2012), pp. 301 308. URL: http: //arxiv.org/ftp/arxiv/papers/1202/1202.1895.pdf. [7] P. Salehyan. Introdução às Curvas Elípticas e Aplicações. IMPA. [8] C. Yuzo Shine. «Corpos Finitos». Em: X Semana Olímpica 1.1 (jan. de 2007), pp. 1 6. URL: http://www.obm.org.br/export/sites/default/ semana_olimpica/docs/2007/corpos.pdf. 28