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

Documentos relacionados