CRIPTOGRAFIA Cryptography differs from all other fields of
Transcrição
CRIPTOGRAFIA Cryptography differs from all other fields of
CRIPTOGRAFIA Cryptography differs from all other fields of endeavor in the ease with which its requirements may appear to be satisfied. Simple transformations will convert a legible text into an apparently meaningless jumble. The critic, who wishes to claim that meaning might yet be recovered by cryptanalysis, is then faced with an arduous demonstration if he is to prove his point of view correct. Experience has shown, however, that few systems can resist the concerted attack of skillful cryptanalysts, and many supposedly secure systems have subsequently been broken. DIFFIE AND HELLMAN, NEW DIRECTIONS IN CRYPTOGRAPHY, 1976. História Alguns métodos não muito sofisticados de criptografia: • Método mais tosco: permutação do alfabeto (ou usar outros símbolos...). É muito frágil: análise de frequência. • Cifra de Vigenère (usada p.ex. por militares séc XIX): somar módulo 26 (letra por letra) à mensagem original um string. Esse string é uma palavra-chave repetida: CHAVECHAVECHAVE... Fica vulnerável à análise de frequência uma vez descoberto o comprimento da chave. • Uma alternativa é usar como string uma pág de um livro. Mesmo assim não é invulnerável... (Procurar palavras frequentes...) • Se fosse usado um string (longo) aleatório, e fosse usado apenas uma vez, então teríamos uma cifra indecifrável. Porém esse método é muito pouco conveniente. • Métodos mais complicados (1a e 2a Guerra), inclusive mecânicos (máquina Enigma alemã). Idéias comuns a esses métodos: • Há um canal seguro (porém lento, com pouca capacidade...) por onde é transmitida previamente a chave. • Há outro canal inseguro (sujeito a escuta) (porém rápido) por onde vai a mensagem cifrada. • As cifras são simétricas: As operações de Cifrar e Decifrar são muito parecidas, e ambas dependem do conhecimento da (mesma) chave. Obs: Além da escuta, outra coisa q deve ser evitada é a falsificação de mesnsagens. É evidente que a criptografia tem inúmeras aplicações (civis) nos dias atuais: Compra com cartão de crédito e débito; caixas eletrônico; comércio por internet; colocar as notas dos alunos no site da PUC. A distribuição de chaves via canal lento seguro é pouco factível em muitos desses casos. [[Obs: O Itaú distribuía cartões com senhas, e agora distribui o "iToken"; se bem q isso não é chave de criptografia...]] Além do mais, com a capacidade computacional disponível hj em dia, usar a mesma chave várias vezes é muito inseguro. Obs: Nesse momento, falar em binário, ASCII, etc. (?) Até aprox. a década de 1970, o probema de distribuição de chaves parecia incontornável. Porém foi encontrada uma maneira de se transmitir informação de maneira segura usando apenas um canal inseguro. Veremos 2 sistemas: Distribuição pública de chaves, e Criptografia de chave pública. 1o sistema: Distribuição de chaves via canal público (ie, inseguro) Primeiro, revejamos a situação clássica usando uma analogia do Singh: Suponha q os funcionários do correio vão espionar qquer mensagem desprotegida. Alcides quer enviar uma mensagem pra Belmiro. A já enviou para B de maneira segura uma chave de um cadeado. Então ele coloca a mesnagem numa caixa de ferro, fecha com o cadeado, e manda pelo correio. A inconveniência é que eles tem q ter trocado a chave antes. Uma solução para isso: A envia para B uma caixa de ferro com a mensagem trancada com o cadeado A (que só ele tem a chave). B recebe, coloca além disso o cadeado B, e envia de volta. A retira o seu cadeado e envia de volta para B. B recebe a caixa, retira o seu cadeado, e lê a mesnagem. Problema disso: as duas operações devem comutar (aba^{-1}b^{-1}=id). [Analogia: colocar meia, colocar sapato, tirar meia, tirar sapato: não funciona.] Permutações em geral não comutam. Ok, agora falando sério: Um idéia importantíssima é que existem bijeções f:X -> Y tais que é fácil (em termos de tempo computacional) calcular f(x), porém é extremamente difícil (na prática podendo ser impossível) calcular f^{-1}(y). Essas são chamadas funções de mão-única. Um exemplo é exponenciação/logaritmo módulo q. Interlúdio teórico Teorema: Seja $p$ um primo. Existem números $r$ tais que a função de {1,..., p-1} em si mesmo dada por f(x) = r^x mod p é uma bijeção. (Na verdade, $p$ não precisa ser primo, mas depois vamos precisar disso p/ outra coisa) Esses $a$'s são chamados "raízes primitivas módulo $p$". Ver http://en.wikipedia.org/wiki/ Primitive_root_modulo_n Exemplo: mod p=11, r=2 2^1 = 2 2^2 = 4 (obs: esse 4 nao eh raiz primitiva pq 2 não é primo com p-1=10) 2^3 = 8 (esse tb eh raiz primitiva) 2^4 = 5 2^5 = 10 2^6 = 9 2^7 = 7 2^8 = 3 2^9 = 6 2^10 = 1 Obs: Pelo Peq. Teorema de Fermat, $r^{p-1} = 1 mod p$. Observações computacionais: • Dá pouco trabalho calcular exponencial: p.ex. $r^18 = (((r^2)^2)^2)^2) * r^2$. • Porém calcular "logaritmos" dá muito trabalho. Os métodos conhecidos não são muuuito mais eficientes do que testar caso a caso. Ver aqui: http://en.wikipedia.org/wiki/Discrete_logarithm • Como encontrar $r$ (uma vez escolhido $p$)? Isso eu não sei! Segundo a Wikipedia: No simple general formula to compute primitive roots modulo n is known. There are however methods to locate a primitive root that are faster than simply trying out all candidates. Li em outro lugar: Choosing r at random and testing until we found a primitive root would not be expected to take too long. (É nesse estilo que se encontram números primos; ver abaixo.) O gráfico de $f(n) = rˆn mod p$ com $p=211$, $r=2$ mostra como a coisa tem uma distribuição complicada: obs: o gráfico foi feito com Maple assim: > with(numtheory): > with(plots): > nextprime(200); 211 > primroot(211); 2 > pointplot({seq([n, 2^n mod 211],n=1..210)}); Solução de Diffie-Hellman para o problema de distribuição de chaves (1976): 1. Escolha $r$ e $p$ e os divulgue publicamente. $p$ deve ser grande (tipo 10^100). 2. Alcides e Belmiro cada um escolhem secretamente numeros x_a e x_b entre 1 e p-1. 3. Alcides calcula $y_a = r^{x_a}$ e envia para Belmiro (ou divulga publicamente, dá no mesmo). Similarmente, Belmiro envia/divulga $y_b = r^{x_b}$. 4. Alcides calcula $k= {y_b}^{x_a}$. Belmiro calcula $k = {y_a}^{x_b}$. O valor é o mesmo $k = r^{x_a x_b}$. 5. Agora para A e B se comunicarem eles usam algum sistema tradicional com a chave $k$ (por exemplo, somar k, se a mensagem for curta). Note que um espião vai saber os valores de $y_a$ e $y_b$, mas não vai conseguir calcular $k$, pois ele não consegue calcular logaritmos. [Obs: Se o espião conhecesse apenas $y_a$, o problema seria totalmente equivalente a calcular um logaritmo, mas como ele conhece $y_a$ e $y_b$ talvez ele tenha alguma vantagem. Isso não é sabido.] Desvantagem: Requer várias comunicações... obs: A RSA não é baseada em logaritmo discreto, mas existe um sistema de criptografia de chave pública que é: Sistema ElGamal (1985). 2o sistema: Criptografia de chave pública. [Obs histórica: Diffie e Hellman propuseram Cripografia de chave pública no paper de 1976, mas não souberam dar nenhum exemplo. Esse paper influenciou a descoberta da RSA.] Aqui, a idéia é a seguinte: • M é um universo finito de possiveis mensagens (p.ex., todas as mensagens de 200 bits). • Temos um par de bijeções $C$, $D$ (cifrar/codificar, decifrar) do universo M, sendo uma inversa da outra. • Existem algoritmos rápidos para calcular $C(x)$ e $D(y)$. • Quem tem a habilidade de calcular $C(x)$ para $x$ qquer não consegue facilmente calcular $D(y)$ para um $y$ dado. [É claro que há uma maneira teórica mas totalmente impraticável de calcular $x = D(y)$: teste todos os $x$ até encontrar aquele tal que $C(x)=y$.] Belmiro quer receber mensagens de maneira segura. Ele escolhe e divulga $C$ (chave pública), mas guarda $D$ (cahve privada). Quando Alcides quer enviar uma mensagem $x$ a Belmiro, ele envia $C(x)$ (Mensagens longas podem ser divididas em blocos). Analogia do correio (Singh): Belmiro distribui nas agências de correio muitas cópias de um cadeado do qual apenas ele tem a chave. Quem quiser enviar uma mensagem para ele coloca a msg numa caixa, pega um cadeado, fecha e envia. Obs: Tem que tomar cuidado que o funcionário do correio não forneça um outro cadeado. (Isso é chamado Man-in-the-middle attack.) Implementação RSA (Rivest, Shamir, Adleman, 1978) As bijeções $C$ e $D$ são da seguinte forma: $y = C(x) = x^c mod m$, $x = D(y) = y^d mod m$. Os números $c$ e $m$ são públicos, mas apenas Belmiro conhece $d$. Quando isso vai funcionar? Pra começar, precisamos que as funções sejam uma inversa da outra, isto é, que $x^{cd} = x mod m$ para todo $x$. Primeira tentativa (Henri chama de baby-RSA): Tente tomando m=p é primo. Se d é relativamente primo com p-1 então existe c tal que $cd = 1 mod p-1$. Lembre do pequeno teorema de Fermat: $n^{p-1} = 1 mod p$ pra todo $n$. Segue que $x^{cd} = x mod m$ para todo $x$. Porém esse método é inútil: conhecendo $p-1$ e $c$, qualquer um pode usar o algoritmo de Euclides e rapidamente encontrar o inverso multiplicativo $c$ de $d$ mod $p-1$. RSA de verdade: Pegue $m=pq$ onde $p$ e $q$ são primos grandes. Seja $d$ relativamente primo com $(p-1)(q-1)$. Seja $c$ o inverso multiplicativo modulo $(p-1)(q-1)$. Então $cd = 1$ módulo $p-1$ e módulo $q-1$. Logo (mesmo agumento do baby-RSA) $x^{cd} = x$ mod $p$ e mod $q$. Pelo Teorema Chinês dos Restos, $x^{cd} = x$ mod $pq$. Outra utilidade: Assinaturas Citando Singh: O processo RSA pode ser invertido, usando a chave particular para cifrar e a chave pública para decifrar. Se Belmiro usar sua chave particular para codificar uma msg para Alcides, então todos poderão decrifrá-la, pois todos conhecem a chave pública de Belmiro. Contudo esse modo de operação verifica a autenticidade, pois se Alcides pode decifrar a mensagem, enttão ela deve ter sido cifrada usando a chave particular de Belmiro; e como só B tem acesso a essa chave, ele é o autor da msg. Comentários práticos: • Como encontrar números primos grandes? Isso não é tão difícil; ver paper [RSA]. Pelo Teorema dos Números Primos, a "probabilidade" de um número próximo a $n$ ser primo é $1/\ln n$. Para n=10^100, isso dá 0.4% [Obs pra aula: ln n ~ log_10(n)/ 2]. Assim testando algumas centenas de números aleatórios acabamos encontrando um primo. Os testes podem ser feitos com algoritmos probabilísticos, que respondem mais ou menos rápido e cuja resposta é muito provavelmente certa. [Comentar sobre o algoritmo AKS; K e S eram alunos de graduação.] • Comentários sobre a segurança: Quem conseguir fatorar m=pq tá feito, porque aí descobre (p-1)(q-1) e portanto pode calcular rapidamente d a partir de c. A RSA se apóia no fato de não se conhecido algoritmo eficeinte p/ fatorar um número muito grande n =pq. O número de operações para fatorar m cresce exponencialmente com o número de dígitos de m. Então acrescentando mais dígitos ganhamos um nível de segurança grande A companhia RSA (RSA Factoring Challenge) publicava (1991-2006) alguns números da forma p.q, e dava prêmios em dinheiro (não muito) para quem conseguisse fatorá-los. P.ex. o número RSA-640 (640 dígitos binários, 193 dígitos decimais) foi fatorado por uns caras de uma universidade alemã (Bonn) em 2005 e recebeu um prêmio de 20 mil dólares. The computation took 5 months on 80 2.2 GHz AMD Opteron CPUs (64 bit). • Aparentemente não tem como um criptoanalista driblar o problema de fatorar m=pq. P.ex. descobrir m'=(p-1)(q-1) a partir de m é tão complicado quanto fatorar m. Isso pq conhecendo m e m' é fácil calcular p e q. (Vide paper [RSA].) • Como encriptar via RSA é um pouco trabalhoso computacionalmente, o que acontece na prática é que ela é usada pra transmitir uma chave que é então usada para uma cifra simétrica. Observações finais: • A RSA é usada em comunicação pela Internet: ver http://en.wikipedia.org/wiki/ Transport_Layer_Security • Existem sistemas ainda mais sofisticados (curvas elípticas). • A idéia de chave pública, o prtocoloco Diffie-Hellman, e a RSA foram descobertos antes e independentemente por cientistas (Ellis, Williamson, Cocks) de um órgão do governo britânico, mas as descobertas foram classificadas secretas! • Um computador quântico seria capaz de fatorar números rapidamente e assim decifrar RSA. Mas tem a criptografia quântica... Bibliografia (além da Wikipedia): • Simon Singh, O Livro dos Códigos • paper Diffie - Hellman 1976 • paper RSA: muito bem escrito, comenta questões práticas Livros q parecem interessantes mas q não tive acesso: • Coutinho (publicado SBM) • An Introduction to Mathematical Cryptography (Undergraduate Texts in Mathematics). Jeffrey Hoffstein, Jill Pipher, J.H. Silverman