|
A criptografia,
que consiste na troca de informações sem que haja o comprometimento
do sigilo, talvez seja tão antiga quanto a própria escrita.
Para criptografarmos algo,
fazemos o uso de chaves, que permitem a codificação e a decodificação
da informação.
Um exemplo de criptografia
foi usado por Júlio César, que foi um grande Imperador de Roma, participou
do primeiro triunvirato (junto com Pompeu e Crasso, em 60 a.C.) e
foi assassinado no Senado em 44 a.C.. A chave utilizada por Júlio
César era muito simples: desloca-se o alfabeto 3 letras e troca-as
entre si.
A B C D E F G H I J K
L M N O P Q R S T U V W X Y Z
D E F G H I J K L M N
O P Q R S T U V W X Y Z A B C
Por exemplo, se ele quisesse
enviar a mensagem "Veni, vidi, vici", a mensagem criptografada
seria "YHQL YLGL, YLFL".
Este tipo de criptografia
é classificada como criptografia de chave simétrica, ou seja,
que utiliza a mesma chave para codificar e decodificar a informação.
Outra
história famosa, e real, sobre utilização da criptografia é a história
de Billy, que durante a guerra pela independência dos Estados Unidos,
entregou ao dono de um hotel onde se hospedara um envelope. Billy
disse a ele, que era um homem de conhecida confiança na época, que
se ele, Billy, não retornasse em 10 anos, o dono do hotel receberia
um telegrama com instruções de o que fazer com aquele envelope. Além
disso, Billy também disse que havia 3 folhas dentro do envelope, cada
qual contendo uma parte da mensagem: a primeira dizia como, a segunda
dizia o que e a terceira dizia a quem. Passaram-se 10 anos e nada
de o dono do hotel receber o telegrama. Este homem, como era um homem
de honestidade inquestionável, resolveu esperar mais tempo. Passaram-se
mais 5 anos, então ele resolveu abrir o envelope. Dentro dele, foram
encontradas 3 folhas, como Billy havia dito. Nessas folhas, havia
números. Muitos números, separados por vírgulas. Era uma mensagem
criptografada. Como decifrá-las, se as instruções nunca foram conhecidas? Muitas tentativas foram feitas, até que
se conseguiu decifrar a segunda folha. Nela estava escrito que as
folhas diziam respeito a valores de U$20.000.000,00. As outras duas
folhas nunca foram decifradas.
O método
que Billy utilizou para criptografar esta segunda folha foi o seguinte:
> a partir de um texto
qualquer, numeram-se as palavras;
1-
2 ---3 -4---
5----- 6-----
7------- 8----
9
> cada número corresponde
à primeira letra da palavra correspondente;
> cada letra pode ter
mais de um número, onde pode ser usado qualquer um deles.
Neste caso, se quisermos
enviar a mensagem "panda", devemos então enviar os números
9,1,7,3,1.
Billy utilizou, na ocasião,
o texto da Declaração de Independência dos Estados Unidos. Quem conseguir
decifrar as outras duas folhas pode ser contemplado com um tesouro
de U$20.000.000,00.
Criptografia
RSA
A criptografia RSA
foi pensada por Rivest, Shamir e Adleman, sendo os dois primeiros
da área da computação e o último, da área da matemática. Ela é uma
criptografia de chave assimétrica, ou seja, utiliza uma chave
pública e uma chave privada. A chave pública é utilizada
para codificar e a chave privada para decodificar. O nome chave
pública vem do fato de que você pode distribuir esta chave a qualquer
pessoa sem comprometer a segurança dos dados ou da chave privada.
Toda mensagem criptografada via RSA é decodificável sem a chave. Porém,
a decodificação é inviável devido ao tempo que esta operação demoraria.
Por exemplo, se você usar
SSH (Secure SHell), você pode mandar sua chave pública (por exemplo,
o conteúdo do arquivo ~/.ssh/identity.pub) para um administrador
de algum sistema que você queira acessar para colocar em seu arquivo
~/.ssh/authorized_keys. Para qualquer um que realmente queira acesso,
é necessário que este alguém tenha a chave privada correspondente
(por exemplo, o conteúdo decodificado de ~/.ssh/identity) para se
identificar. Para proteger a chave privada, você deve entrar com uma
passphrase para codificar a chave quando esta é guardada no
sistema de arquivos. Isto previnirá que pessoas a utilizem, mesmo
que consigam acesso a seus arquivos.

Quadro 1 - Exemplo de
geração de chave RSA em uma shell linux
Toda comunicação é feita
usando outros tipos de criptografia, como o IDEA ou outros (DES, RC4-128,
TSS, Blowfish). A troca das chaves é feita usando RSA, e os dados
usados para a troca da chave são destruídos a cada hora
(as chaves não são salvas em lugar algum). Cada host tem uma chave
RSA que é usada para autenticar o host quando a autenticação RSA é
usada.

Quadro
2: Tipos de ataques que o SSH pode prevenir
Mas como funciona a criptografia
RSA? Se você olhar na geração da chave SSH, verá que são gerados 2
números (p e q). Estes números são a base da criptografia
RSA e devem ser dois primos grandes e com uma grande diferença numérica
entre si.
A verificação para saber
se um número n é primo ou não pode ser feita tirando-se a raiz
quadrada de n e dividindo-o por todos os primos anteriores
a este resultado.
Obs.: Número de primos menores
que x ~ x/ln(x)
Exemplo 1: Verificar
se 101 é primo ou não.
Solução:
basta dividir 101 pelos primos 2, 3, 5 e 7. Se alguma dessas divisões
for exata (inteira), então 101 não é primo. Se todas as divisões não
são exatas, 101 é primo.
Exemplo 2: Verificar
se r = 123456789012345678901234567890123456789012347 é primo
ou não.
Solução:
a partir de um certo ponto, é muito trabalhoso estabelecer a seqüência
dos primos menores que raiz quadrada
de r. Como r tem 45 algarismos, resulta que 10^44 < r
< 10^45
Então 10 ^22 < raiz quadrada
de r < 10^23.
Em vez de dividir r
pelos números primos menores do que 10^2,3 podemos dividir r
pelos números ímpares 1, 3, 5, 7, 9, 11 ... menores do que 10^23.
No caso de r ser
primo, o número de divisões que é necessário efetuar está entre (10^22)/2
e (10^23)/2.
Suponhamos que um computador
efetue 10^10 divisões por segundo.
1 ano tem 31.536.000 segundos.
Então esse computador efetua 31.536.000*10^10 divisões em um ano,
o que é menor que 10^18.
Se o computador efetuasse
as 10^18 divisões em um ano, para efetuar (10^22)/2 divisões ele demoraria
5000 anos.
Se aumentarmos este número
de 45 para 49 algarismos, conseqüentemente o tempo que esse computador
levaria para determinar se tal número é primo ou não seria de 500.000.000
anos.
Tempos como estes são classificados
como tempos não polinomiais.
Em Z(inteiros): Definição:
x y
(mod n) significa que x-y é múltiplo de n, ou,
x é côngruo com y (mod n).
Notação: x^y significa
x elevado a y.
p*q significa
q somado p vezes.
Obs.:
1) 3^7
31(mod 77) ------------------e
------------------ 31^43
3(mod 77)
2) p*q = n = 192343993140277293096491917
(27 algarismos, produto de 2 primos)
43^731 103730879700159299993828112(mod
n)
103730879700159299993828112^134482257019077958238644371 43(mod
n)
onde:
43 é a mensagem.
103730879700159299993828112 é a mensagem
criptografada.
134482257019077958238644371 é a chave
privada.
731 é a chave pública.
É claro que para a utilização
prática, o número de algarismos de cada chave é bem maior. Quanto
maior a chave, mais tempo alguém levaria para decodificar a mensagem.
Inversos Módulo N
Teorema:
Se mdc(a,n) = 1, então existe
um único b entre 1 e n-1 tal que
a*b
1 (mod n)
diz-se então que b é
o inverso de a módulo n, e se escreve
b = a^(-1) mod n
Exemplo: mdc(3,11) = 1.
Então existe um único b entre 1 e 10 tal que 3*b 1(mod
11).
Por tentativa, b = 4, ou seja,
3*4 1
(mod 11)
4 = 3^(-1) mod 11.
Função Ø de Euler
Definição: (n em Z, n >=
1)
Ø(n) = número de inteiros
s tais que 1 <= s <= n-1 e mds(s,n) = 1.
Exemplos: Ø(5) = 4, Ø(25)
= 20, Ø(8) = 4.
Propriedades:
1) Ø(p) = p-1 e Ø(p^n) =
p^(n-1) se p é primo,
2) Ø(a*b) = Ø(a)*Ø(b), a
e b quaisquer >= 1.
3) Ø(a1*a2*a3*...*an) =
Ø(a1)*Ø(a2)*Ø(a3)*...*Ø(an), a1...na quaisquer >= 1.
Teorema (Fundamentação para
RSA):
Sejam n, p, q, a, b inteiros
positivos, tais que
p e q são primos,
n = p*q,
ab 1(mod
Ø(n)), isto é, b = a^(-1) mod Ø(n).
Nessas condições,
Se m^b y
(mod n) então y^a m
(mod n).
Para um usuário, digamos
José, receber mensagens criptografadas, ele deve obter números inteiros
positivos n, p, q, a, b, tais que:
p e q são primos
n = p*q
a*b
1 (mod Ø(n)), a e b entre 1 e Ø(n).
n e a são chaves públicas
de José.
b é a chave secreta de José.
p e q são secretos (somente
José os conhece).
Para Alice codificar uma mensagem m
pertencente a Z (inteiros), (2 <= m <= m-2), ela calcula
y = m^a(mod n).
y é a mensagem codificada, a
qual é enviada para José.
Para José decodificar y, ele usa sua
chave secreta b e calcula
y^b (mod n)
e encontra m, conforme teorema
anterior (Fundamentação para RSA).
Para algum
intruso conseguir decifrar esta mensagem, ele deveria conhecer a chave
b.
Para isto:
1) Ele precisa obter Ø(n).
Tendo Ø(n) e usando a chave pública a, ele calcula b = a^(-1) (mod
Ø(n)).
2) Para obter Ø(n), ele
precisa conhecer p e q, pois Ø(n) = (p-1)*(q-1).
3) Para obter p e
q, ele precisa fatorar n, pois n = p*q.
Fato: com a tecnologia e
os algoritmos conhecidos nos dias de hoje, a fatoração de n
não poderá ser feita em tempo polinomial se:
1) p e q tiverem
cerca de 130 algarismos cada um no sistema decimal.
2) p e q não
podem estar próximos um do outro, isto é, a diferença entre p
e q deve ser relativamente grande.
3) p-1 deve ter um fator
primo grande.
4) q-1 deve ter um fator
primo grande.
Se José escolhe p
e q sob as condições acima, então um intruso não consegue fatorar
n em tempo polinomial; logo, não obtém Ø(n); logo, não obtém
b; logo, não consegue decodificar y.
Referências:
A Course in Number Theory
and Cryptography, Neal Koblitz.
Criptography
- Theory and Practice, Douglas R. Stinson.
bit_@softhome.net

|