• Nenhum resultado encontrado

Sistema Merkle-Hellman

No documento Criptografia e Segurança (páginas 73-91)

Nesta sec¸c˜ao descrevemos outro tipo de criptosistema que ´e baseado no pro-

blema do saco-mochila (em inglˆes, ”Knapsack”). Dados k inteiros v0, . . . , vk−1

e um inteiro V , o problema Saco-mochila consiste em determinar se existe um subconjunto dos k inteiros cuja soma seja V , i.e. se existem ϵi ∈ {0, 1},

tais que

k−1

i=0

ϵivi = V.

Note que podem haver imensas solu¸c˜oes, nenhuma solu¸c˜ao, ou uma ´unica solu¸c˜ao, dependendo dos vi’s e de V . Um caso particular do problema saco-

mochila, ´e quando os vi’s, ordenados de forma crescente, tˆem a propriedade de

que cada um ´e maior que a soma dos anteriores. Este caso especial ´e chamado

super crescente. Por exemplo, a sequˆencia (2, 3, 7, 15, 31) ´e supercrescente. Sabe-se que o problema geral do saco-mochila pertence `a classe de pro- blemas muito dif´ıceis conhecidos como NP-completos (i. e. problemas NP tais que qualquer outro problema NP se pode reduzir a eles). Os problemas NP-completos tˆem a extraordin´aria propriedade de que se um deles estiver na classe P (existir um algoritmo que o resolva em tempo polinomial), ent˜ao P=NP.

O problema do saco-mochila super crescente ´e, no entanto, muito mais f´acil de resolver. O seguinte algoritmo (de tempo polinomial) permite-nos resolver qualquer problema do saco-mochila super crescente:

1. Fa¸ca W = V e j = k.

2. Se vi > W para 0 ≤ i ≤ j − 1 ir para o passo 4. Caso contr´ario,

determine o maior dos vi’s, digamos vi0, tal que vi0 ≤ W . Fa¸ca ϵi = 0

para i > i0 e ϵi0 = 1.

3. Substitua W por W − vi0 e j = i0. Se W > 0, voltar ao passo 2.

4. Se W = 0 o algoritmo termina e encontrou-se a solu¸c˜ao

ϵ = (ϵ0, . . . , ϵk−1),

(que ´e ´unica) do problema. Se W > 0, todos os restantes vi’s s˜ao

maiores que W , portanto, n˜ao h´a solu¸c˜ao do problema.

Exemplo. Considere a sequˆencia (2, 3, 7, 15, 31) e V = 24. Ent˜ao ϵ4 = 0,

ϵ3 = 1 (e substituimos 24 por 9), ϵ2 = 1 (e substitui-se 9 por 2), ϵ1 = 0 e

ϵ0 = 1. Portanto, a solu¸c˜ao ´e ϵ = (1, 0, 1, 1, 0).

Estamos em condi¸c˜oes de descrever o criptosistema de Merkle-Hellman (tamb´em chamado sistema do saco-mochila), baseado no problema descrito atr´as. As mensagens originais v˜ao ser inteiros com k bits. Por exemplo, se usarmos o alfabeto de 27 letras (com o espa¸co em branco) e k = 5, temos a codifica¸c˜ao (letra a letra, neste caso) 2 = (00000)2, A = (00001), . . . , Z =

(11010). Em seguida, escolhemos uma sequˆencia super crescente v0, . . . , vk−1,

um inteiro n > v0+ v1+· · · + vk−1 e um inteiro 0 < a < n tal que (a, n) = 1

(costuma-se tomar n primo). Calculamos b ≡ a−1 mod n e a sequˆencia de inteiros positivos

wi ≡ avi mod n

para qualquer 0≤ i ≤ k − 1. A chave secreta de Alice consiste da sequˆencia dos vi’s e dos inteiros n, a e b. A sua chave p´ublica ´e (w0, . . . , wk−1). Esta ´e

a chave para cifrar.

Se Bob pretende enviar uma mensagem m = (ϵk−1· · · , ϵ0)2 a Alice, usa a

chave {wi} e envia c≡ k−1i=0 ϵiwi.

Note que para determinar a mensagem original a partir de c um atacante ”s´o”tem que resolver um problema do saco-mochila mas, neste caso, este problema ´e dif´ıcil porque a sequˆencia {wi} n˜ao ´e super crescente.

Para decifrar c, Alice calcula V ≡ bc mod n. Como bc≡ k−1i=0 ϵibwi k−1i=0 ϵibavi k−1i=0 ϵivi mod n

Ent˜ao V =ki=0−1ϵivi (note que V < n). Como a sequˆencia {vi} ´e super

crescente, Alice usa o algoritmo descrito atr´as para obter a solu¸c˜ao ϵ = 0, . . . , ϵk−1) e obt´em a mensagem m = (ϵk−1· · · , ϵ0)2.

Exemplo. Consideremos a codifica¸c˜ao em bits do nosso habitual alfabeto de

27 letras. Tomemos a chave secreta

((v0, . . . , vk−1), n, a) = ((2, 3, 7, 15, 31), 61, 17)

Ent˜ao b = 18 e a chave de cifrar ´e (34, 51, 58, 11, 39). Queremos enviar a mensagem ”SIM”. Temos que, ”S”= (10011)2, ”I”= (01001)2 e ”M”=

(01101)2. Portanto, enviamos os inteiros 124 = 34 + 51 + 39, 45 = 34 + 11 e

103 = 34+58+11. A mensagem cifrada 124, 45, 103 poderia ser descodificada

usando, neste caso, pares de letras. Como

18· 124 ≡ 36 mod 61, 18 · 45 ≡ 17 mod 61 e 18 · 103 ≡ 24 mod 61

obtemos os inteiros 36, 17, 24. Em seguida, usamos a nossa sequˆencia para resolver o problema do saco-mochila para estes inteiros. Assim 36 = 31+3+2, obtendo-se a letra (10011) =S, 17 = 15 + 2, obtendo-se (01001) =I, e 24 =

15 + 7 + 2, obtendo-se (01101) =M.

Durante algum tempo, houve algum optimismo acerca do uso deste crip- tosistema, porque a base da sua seguran¸ca ´e um problema que se sabe ser NP-completo (os problemas factoriza¸c˜ao e logaritmo discreto, s˜ao NP, mas n˜ao se sabe se s˜ao NP completos). Em 1982, Shamir encontrou um algoritmo que permitia quebrar este sistema em tempo polinomial. V´arias varia¸c˜oes deste sistema tem sido consideradas, tendo algumas sido tamb´em quebradas (e. g. Brickell 1985). Uma das varia¸c˜oes deste sistema que ainda n˜ao ter´a sido quebrado ´e o sistema de Chor-Rivest, que n˜ao iremos descrever neste curso.

Cap´ıtulo 5

Primalidade

Existem imensas situa¸c˜oes em que podemos necessitar de saber se um in- teiro enorme ´e primo. Por exemplo, nos sistemas criptogr´aficos estudados no cap´ıtulo anterior, precisamos quase sempre de pelo menos um primo enorme e aleat´orio. Uma interpreta¸c˜ao do que significa ”primo enorme e aleat´orio”pode ser a seguinte: Primeiro geramos um inteiro ´ımpar n0, us-

ando um gerador de n´umeros aleat´orios e depois testar a primalidade de n0,

n0 + 2, . . . at´e que encontremos o primeiro primo p ≥ n0. Outra situa¸c˜ao

em que se usam testes de primalidade, ´e quando se quer determinar se in- teiros de formas muito especiais s˜ao ou n˜ao primos. Por exemplo, n´umeros de Mersenne (da forma 2p− 1) ou n´umeros de Fermat (da forma 22k+ 1).

Um teste de primalidade probabil´ıstico ´e um crit´erio para um n´umero nao ser primo. Se n passa uma aplica¸c˜ao de um teste de primalidade, ent˜ao pode ser que seja primo. Se n falha um teste de primalidade ent˜ao ´e (obriga- toriamente) composto. Se passar muitas vezes um teste de primalidade ent˜ao tem grande probabilidade de ser primo (podendo por vezes ter-se a certeza que ´e realmente primo). No caso de n ser composto ficamos ainda com o problema de factorizar n. Com os algoritmos existentes consegue-se verificar se um n´umero com alguns milhares de algarismos ´e primo, com grande prob- abilidade (se n tiver uma forma especial, por exemplo se for um n´umero de Mersenne ou de Fermat, consegue-se atestar a primalidade de n´umeros com milh˜oes de algarismos), enquanto que s´o se consegue factorizar n´umeros (que n˜ao tenham nenhuma forma particular) com perto de 200 algarismos.

5.1

Teste de Fermat

Antes de descrevermos este teste de primalidade recordemos algumas defini¸c˜oes de teoria elementar dos n´umeros.

Defini¸c˜ao. Seja a > 1 um inteiro positivo. Chamamos pseudoprimo para a base a a um composto n tal que (a, n) = 1 e n| (an− a).

Defini¸c˜ao. Um composto n que ´e pseudoprimo para qualquer base a, tal que (a, n) = 1 chama-se n´umero de Carmichael.

Exemplo. Os n´umeros 561, 1105 e 6601 s˜ao n´umeros de Carmichael.

O teste de Fermat ´e baseado no Pequeno Teorema de Fermat. Dados n e 1 < a < n, o teste consiste verificar se an−1 ̸≡ 1 mod n. Podemos aplic´a-lo usando sucessivas bases a: Dado um inteiro n, come¸camos por calcular

a ≡ 2n−1 mod n se a̸= 1 ent˜ao n ´e composto. Se a = 1, calculamos

b ≡ 3n−1 mod n

Caso b ̸= 1, temos que n ´e composto. Se b = 1 calculamos 5n−1 mod n e assim sucessivamente.

Infelizmente, h´a inteiros que passam este teste para qualquer base, os chamados n´umeros de Carmichael. Portanto, n˜ao ´e poss´ıvel provar que n´e primo, usando sucessivas aplica¸c˜oes deste teste.

Exemplo. Considere n = 341. Temos 2340 ≡ 1 mod 341. Mas 3340 ≡ 56

mod 341. Portanto, 341 ´e composto. De facto, 341 = 11· 31. Prov´amos tamb´em que 341 ´e pseudoprimo para a base 2 mas n˜ao ´e pseudoprimo para a base 3.

Note que este teste, embora prove que n ´e composto, n˜ao d´a qualquer indica¸c˜ao sobre os factores de n. S´o mostra que a n falta uma propriedade que todos os primos tˆem.

5.2

Teste de Miller-Rabin

Nesta sec¸c˜ao, descrevemos o teste de Miller-Rabin. Contrariamente ao teste de Fermat, para este teste n˜ao h´a inteiros correspondentes aos n´umeros de Carmichael, i. e. o teste de Miller-Rabin pode provar que ´e de facto primo qualquer inteiro que passe o teste um n´umero suficiente de vezes.

Teorema 5.1. Seja n um primo ´ımpar e sejam s e d tais que n− 1 = 2sd, com d ´ımpar. Se a ´e um inteiro tal que (a, n) = 1, ent˜ao ou

ad ≡ 1 mod n ou existe 0 ≤ r ≤ s − 1 tal que

a2rd≡ −1 mod n

Demonstra¸c˜ao: Seja a tal que (a, n) = 1. Como n ´e primo temos que

φ(n) = n−1 = 2sd. Donde, k = ord

n(ad) ´e uma potˆencia de 2. Se k = 1 = 20,

temos que

ad≡ 1 mod n.

Se k > 1 ent˜ao existe 1≤ l ≤ s tal que k = 2l e

a2ld≡ 1 mod n.

Mas ent˜ao a2l−1d ̸≡ 1 mod n e a2l−1d tem ordem 2 mod n. Logo a2l−1d ´e

solu¸c˜ao da congruˆencia x2 ≡ 1 mod n. Como n ´e primo, as ´unicas solu¸c˜oes desta congruˆencia s˜ao 1 e−1. Portanto,

a2l−1d≡ −1 mod n

2

Defini¸c˜ao. Seja n um composto ´ımpar, e sejam s e d tais que n− 1 = 2sd,

com d ´ımpar. Seja a tal que (a, n) = 1. Se n e a satisfazem a condi¸c˜ao

ad≡ 1 mod n ou existe 0 ≤ r ≤ s − 1 tal que a2rd ≡ −1 mod n (5.1)

Defini¸c˜ao. Dizemos que um inteiro a ´e uma testemunha de que n ´e composto se (a, n) = 1 e a condi¸c˜ao (5.1) n˜ao ´e verificada.

Dados a e n, o teste de Miller-Rabin, consiste em verificar se a condi¸c˜ao (5.1) ´e ou n˜ao verificada por estes inteiros. Se n falhar esta condi¸c˜ao ent˜ao

n ´e composto e a ´e uma sua testemunha.

Exemplo. Seja n = 561. J´a vimos que n ´e um n´umero de Carmichael, portanto o teste de Fermat n˜ao d´a para provar que n ´e composto. Temos que

560 = 24· 35. Consideremos a = 2. Ent˜ao

235 ≡ 263 mod 561 22·35 ≡ 166 mod 561 222·35 ≡ 67 mod 561 223·35 ≡ 1 mod 561

Portanto, 561 ´e composto e o inteiro 2 serve para testemunhar este facto.

Para que o teste de Miller-Rabin seja eficiente, ´e importante que exista um n´umero suficiente de testemunhas para cada composto. O pr´oximo resultado mostra que h´a imensas testemunhas.

Teorema 5.2. Seja n ≥ 3 um composto ´ımpar. O conjunto {1, . . . , n − 1} cont´em no m´aximo n−14 n´umeros que s˜ao primos com n e n˜ao s˜ao testemunhas de que n ´e composto.

Suponhamos que n ´e um inteiro ´ımpar enorme que queremos verificar se ´e primo ou n˜ao. Seja 1 < a < n− 1 escolhido aleatoriamente. A probabilidade de n ser composto e a n˜ao ser uma testemunha ´e, no m´aximo, 0.25. A probabilidade de escolhermos k inteiros a que n˜ao sejam testemunha ´e menor que

1 4k.

Portanto, se um inteiro n passa o teste de Miller-Rabin k vezes, ´e muito prov´avel que seja primo (com probabilidade pelo menos 1 − 1/4k). Para

k = 20, a probabilidade de ser composto tendo passado o teste de Miller-

Rabin k vezes ´e 1 em um bili˜ao. No entanto, note-se que este teste n˜ao nos garante que n seja de facto primo.

a vimos que, dado um composto n, h´a mais de 3(n− 1)/4 testemunhas no intervalo [2, n− 2]. Ser´a que h´a um n´umero B, independente de n, tal

que h´a sempre uma testemunha a < B de que n ´e composto? Infelizmente, a resposta a esta pergunta ´e n˜ao (provado por Alford, Granville e Pomerance). No entanto, se a Hip´otese de Riemann extendida (ERH) for verdade, temos o seguinte resultado

Teorema 5.3. Seja n um n´umero composto. Admitindo a ERH, h´a uma testemunha a, com a < 2 log2n de que n ´e composto.

Portanto, se ERH for verdadeira, existe um algoritmo polinomial para verificar se n ´e primo, baseado no teste de Miller-Rabin.

5.3

Teste de Solovay-Strassen

O pr´oximo teste que iremos estudar ´e baseado no lema de Euler sobre o s´ımbolo de Legendre, j´a estudado. Comecemos por definir o s´ımbolo de Jacobi, que ´e uma generaliza¸c˜ao do s´ımbolo de Legendre.

Defini¸c˜ao. Seja a um inteiro e n =ki=1pai

i um inteiro ´ımpar. Define-se o

s´ımbolo de Jacobi, da seguinte maneira

(a n ) =∏i = 1k ( a pi )ai , onde ( a p ) ´e o s´ımbolo de Legendre.

Para o s´ımbolo de Jacobi tamb´em ´e v´alida a lei da reciprocidade quadr´atica, i. e., se m e n s˜ao inteiros impares

(m n ) = (−1)m−12 n−1 2 (n m ) .

O lema de Euler diz-nos que se p um primo ´ımpar e a um inteiro tais que

p- a. Ent˜ao ( a p

)

= ap−12 mod p.

Dado um inteiro ´ımpar n e a um inteiro, o Teste de Solovay-Strassen consiste em verificar se an−12 (a n ) mod n.

Defini¸c˜ao. Um inteiro n composto que passe o teste de Solovay-Strassen

para um dado a ´e chamado pseudoprimo de Euler-Jacobi para a base a

Teorema 5.4. Para qualquer n´umero composto n h´a pelo menos n/2 bases menores que n tais que n n˜ao ´e um pseudoprimo de Euler-Jacobi para qual- quer uma dessas bases.

5.4

Teste n

− 1 de Lucas

Nas sec¸c˜oes anteriores encontr´amos alguns testes probabilisticos para veri- ficar se n ´e composto. O pr´oximo teste ´e determinista, i. e. se n passar o teste ent˜ao n ´e de facto primo.

Teorema 5.5 (Lucas). Se a e n s˜ao inteiros com n > 1, e

an−1 ≡ 1 mod n, mas an−1q ̸≡ 1 mod n para qualquer primo q | n − 1

ent˜ao n ´e primo.

Demonstra¸c˜ao: A primeira condi¸c˜ao implica que ordn(a) | n − 1. A

segunda condi¸c˜ao, mostra que ordn(a) n˜ao ´e um divisor pr´oprio de n− 1.

Portanto, ordn(a) = n − 1. Mas pelo teorema de Euler, ordn(a) | φ(n),

donde n− 1 ≤ φ(n). Mas se n ´e composto, φ(n) < n − 1, portanto, n ´e

primo. 2

Para usarmos o teorema de Lucas, ´e necess´ario saber a factoriza¸c˜ao em primos de n− 1, e em geral essa factoriza¸c˜ao pode ser dif´ıcil de encontrar. Al´em disso, se n ´e de facto primo, temos que tomar a uma raiz primitiva de

n. Sabemos que h´a φ(n− 1) ra´ızes primitivas, mas estas podem ser dif´ıceis de encontrar. No entanto, para inteiros com formas especiais, o teorema de Lucas, permite-nos obter um teste muito eficiente.

Teorema 5.6 (Teste de Pepin). Para k ≥ 1, o n´umero Fk= 22

k

+ 1 ´e primo se e s´o se

3Fk−12 ≡ −1 mod Fk. Demonstra¸c˜ao: Seja k ≥ 1. Suponhamos que

3Fk−12 ≡ −1 mod F

ent˜ao o teorema de Lucas diz-nos que Fk ´e primo. Reciprocamente supon-

hamos que Fk ´e primo. Como 2k ´e par, ent˜ao

22k ≡ 1 mod 3, donde Fk ≡ 2 mod 3. Mas Fk≡ 1 mod 4, logo

( 3

Fk

) =−1

Pelo teorema 4.11, obtemos a congruˆencia desejada. 2

Teorema 5.7 (Teste de Lucas-Lehmer). Seja s0 = 4 e si = s2i−1− 2. Ent˜ao

Cap´ıtulo 6

Factoriza¸ao

Neste cap´ıtulo, vamos descrever alguns algoritmos importantes de factor- iza¸c˜ao. Iremos assumir que n ´e composto. Este facto pode ser provado usando, por exemplo, um dos algoritmos do cap´ıtulo anterior.

Em muitos dos algoritmos de factoriza¸c˜ao, verifica-se primeiro, por ex- perimenta¸c˜ao, se n ´e divis´ıvel por n´umeros primos pequenos, e. g. p ≤ B, com B fixo.

Exemplo. Queremos factorizar n = 321+1 = 10460353204. Experimentando

primeiro todos os primos menores que 50, verifica-se que n = 22· 72· 43 · 1241143.

Seja m = 1241143. Como 2m−1 ≡ 793958 mod m, o pequeno teorema de Fermat implica que m ´e composto. Ficamos ainda com a tarefa de factorizar m.

6.1

etodo p

− 1 de Pollard

H´a algoritmos de factoriza¸c˜ao que funcionam muito bem para inteiros com- postos que verificam certas propriedades. O m´etodo p − 1, ´e um desses algoritmos e foi inventado por John Pollard. Suponhamos que n ´e composto e que tem um factor primo p, tal que p−1 s´o tem divisores primos pequenos. Ent˜ao ´e poss´ıvel obter um m´ultiplo k de p− 1 sem sabermos o valor de p − 1. Basta tomar k como sendo o m´ınimo m´ultiplo comum de todos os inteiros at´e um limite B. Podemos tamb´em tomar k como sendo B!.

Definamos k = k(B) = [2, 3, 4, . . . , B], onde [a, b] representa o m´ınimoultiplo comum de a e b. Se n tiver um divisor primo p tal que todos os divisores de p− 1 que s˜ao potˆencias de primos forem menores que k, ent˜ao

p− 1 | k. O pequeno teorema de Fermat, implica que ak ≡ 1 mod p,

para qualquer inteiro a, tal que (a, p) = 1. Portanto, p | (ak − 1). Se

n - (ak− 1) ent˜ao (ak− 1, n) ´e um divisor pr´oprio de n.

O algoritmo consiste em come¸car com um limite B e uma base a. Se (ak − 1, n) n˜ao der um divisor pr´oprio de n (i. e. se (ak − 1, n) = 1 ou

(ak− 1, n) = n), ent˜ao experimenta-se outro limite B ou outra base a.

Exemplo. Continuando o exemplo anterior, vamos agora factorizar m =

1241143. Seja B = 13, ent˜ao

k = 8· 9 · 5 · 7 · 11 · 13 e

(2k− 1, m) = 547.

Ent˜ao p = 547 ´e um divisor de n. Portanto, m = 547· 2269. Facilmente, se verifica que 547 e 2269 s˜ao primos.

6.2

etodo r´o de Pollard

Nesta sec¸c˜ao, vamos analisar outro m´etodo de factoriza¸c˜ao introduzido por J. Pollard. Sejam l um inteiro e f uma fun¸c˜ao aleat´oria de S = {0, 1, . . . , l} para S. Seja x0 um elemento aleat´orio e considere-se a sequˆencia

x0, x1 = f (x0), x2 = f (x1), . . . .

Como S ´e finito, a sequˆencia ir´a tornar-se c´ıclica ao fim de um certo n´umero de termos. Se fizermos um diagrama que mostre este comportamento, ele assemelhar-se-´a a ρ, da´ı a origem do nome do m´etodo.

Seja n um inteiro composto. O primeiro passo do m´etodo r´o, consiste em escolher uma fun¸c˜ao f de Z/nZ para Z/nZ que seja f´acil determinar f(x). Costuma-se usar polin´omios com coeficientes inteiros, e. g. f (x) = x2+ 1.

Calculam-se as sucessivas itera¸c˜oes xk = f (xk−1) mod n. Depois fazem-

se compara¸c˜oes entre diferentes xi’s, esperando encontrar dois que sejam

diferentes mod n mas que sejam iguais mod l para algum divisor pr´oprio l de n. Quando encontrarmos xj e xk nestas condi¸c˜oes (i. e. xj ≡ xk mod l),

temos que (xj − xk, n) ´e um divisor pr´oprio de n. Assim como est´a, este

m´etodo ir´a tornar-se moroso, pois ao fim de k itera¸c˜oes temos de comparar aproximadamente k2 pares de valores. Note que se x

j ≡ xk mod l e sendo

m ≥ 0, temos

xj+m ≡ xk+m mod l

Portanto, em vez de efectuar todas as compara¸c˜oes poss´ıveis podemos apenas fazer uma compara¸c˜ao em cada itera¸c˜ao. Por exemplo, podemos calcular somente

(x2i− xi, n)

em cada itera¸c˜ao i. Podemos tamb´em calcular, na itera¸c˜ao k com 2j ≤ k < 2r+1, o m´aximo divisor comum

(xk− xj, n)

onde j = 2j− 1.

Exemplo. Vamos factorizar 4087 usando f (x) = x2+ 1 e x

0 = 3. Obtemos

sucessivamente

x1 = 10, x2 = 101 (101− 10, 4087) = 1

x2 = 101, x4 = 1263 (1263− 101, 4087) = 1

x3 = 2028, x6 = 889 (2028− 89, 4087) = 67

Portanto, 67| 4087. Dividindo, obtem-se 4087 = 67 · 61. Exemplo. Sejam n = 845651, f (x) = x2 + x + 1 e x

0 = 2. Verifica-se que

(x10− x7, n) = 571. Portanto, n = 571· 1481.

Teorema 6.1. O m´etodo r´o permite encontrar um factor de n em O(√4n log3n)

opera¸c˜oes com uma grande probabilidade. Mais exactamente, existe uma con- stante C tal que, para qualquer inteiro positivo λ, a probabilidade de o m´etodo r´o n˜ao encontrar um factor n˜ao trivial de n em C√λ√4 n log3n opera¸oes bit, ´

O teorema anterior garante-nos que este m´etodo ´e, com uma grande prob- abilidade, significativamente mais r´apido que irmos experimentando todos os primos at´e√n. O resultado mais espectacular, usando este m´etodo ocorreu em 1981, quando Brent e Pollard factorizaram completamente F8 = 22

8

+ 1. A seguinte mnem´onica de J. Pollard, permite-nos recordar um dos factores de F8

I am now intirely persuaded to employ rho method, a handy trick, on gigantic composite numbers

6.3

Factoriza¸ao de Fermat

Suponhamos que n ´e o produto de dois primos p e q pr´oximos um do outro. Ent˜ao n ´e a diferen¸ca de dois quadrados, um dos quais ´e pequeno. Neste caso, h´a um processo eficiente de factorizar n chamado factoriza¸c˜ao de Fermat. Por

este motivo deve-se evitar usar tais inteiros n como chave p´ublica, tanto no RSA como no sistema de Rabin.

Teorema 6.2. Seja n um inteiro positivo ´ımpar. H´a uma correspondˆencia bijectiva entre factoriza¸c˜oes de n da forma n = ab, com a ≥ b > 0, e representa¸c˜oes de n na forma t2− s2, onde t e s s˜ao inteiros n˜ao negativos.

A correspondˆencia ´e dada pelas equa¸c˜oes t = a + b

2 , s =

a− b

2 a = t + s b = t− s

Demonstra¸c˜ao: Se n = ab ent˜ao

n = ( a + b 2 )2 ( a− b 2 2)2

donde n pode ser escrito como a diferen¸ca de dois quadrados. Se n = t2− s2

ent˜ao n = (t− s)(t + s). Obtemos assim a correspondˆencia bijectiva. 2

Se n = ab e a e b est˜ao pr´oximos um do outro, ent˜ao s ´e pequeno e t ´e ligeiramente maior que √n. Neste caso, podemos factorizar n, experimen-

tando valores para t, come¸cando por [√n] + 1, at´e que se encontre um para o qual t2− n ´e um quadrado perfeito.

Exemplo. Seja n = 200819. Come¸camos com [√n] + 1 = 449. Agora,

4492− 200819 = 782 que n˜ao ´e um quadrado perfeito. Em seguida, tentamos

t = 450. Temos 4502− 200819 = 1681 = 412, donde n = (450 + 41)(450− 41) = 491 · 409.

Note que se a e b n˜ao estiverem pr´oximos, este m´etodo ainda serve para factorizar n, mas s´o ap´os termos usado imensos valores para t, o que o pode tornar muito moroso. H´a uma generaliza¸c˜ao do m´etodo de Fermat que fun- ciona melhor nesta situa¸c˜ao. Come¸camos por escolher um multiplicador k pequeno e tomamos

t = [√kn] + 1, t = [√kn] + 2, . . .

at´e que obtenhamos um t para o qual t2− kn = s2 ´e um quadrado perfeito. Ent˜ao d = (t + s, n) ´e um factor n˜ao trivial de n.

Exemplo. Seja n = 141467. Se usarmos a factoriza¸c˜ao de Fermat directa- mente, precisamos de experimentar 38 t’s at´e encontrar um factor de n. Mas se tomarmos k = 3 e come¸carmos com t = [√3n] + 1 = 652, rapidamente

vemos que 6552 − 3n = 682. Como (655 + 68, n) = 241, conclu´ımos que

n = 241· 587. Portanto, com k = 3 s´o precisamos de experimentar 4 t’s.

Mas como sabemos que dev´ıamos usar k = 3 no exemplo anterior? Uma maneira de resolver este problema ´e utilizando o m´etodo de Lehman (que ´e uma generaliza¸c˜ao do m´etodo de Fermat).

A ideia deste m´etodo ´e experimentarmos todos os k at´e [3 n] e para cada

um desses k’s , experimentar somente [ 6

n

4√k

]

valores de t. Mais exactamente, primeiro verifica-se se n tem algum divisor

d≤ 3 n. Caso contr´ario, para cada 1 ≤ k ≤ [√3 n], experimenta-se, para cada t inteiro no intervalo ( 2√kn− 1, 2√kn + 6 n 4√k ] ,

se t2− 4kn ´e um quadrado perfeito s2. Caso seja, determina-se d = (t + s, n)

que ´e um factor n˜ao trivial de n. Caso n˜ao se encontre um quadrado perfeito, podemos concluir que n ´e primo.

Para provarmos que este algoritmo de facto funciona, necessitamos do seguinte resultado de Dirichlet:

Teorema 6.3 (da Aproxima¸c˜ao de Dirichlet). Para qualquer n´umero real θ e qualquer inteiro positivo m, existem inteiros a e b, com 1 ≤ a ≤ m tais que

|aθ − b| ≤ 1 m + 1.

Demonstra¸c˜ao: No que se segue iremos representar a parte inteira e a

parte fraccion´aria de um n´umero real x por [x] e{x}, respectivamente. Suponhamos que m = 1. Se {θ} ≤ 12, basta tomar a = 1 e b = [θ], se

{θ} > 1

2, basta tomar a = 1 e b = [θ] + 1. Suponhamos agora que m > 1 e

consideremos os m + 2 n´umeros reais, 0, 1 e

ra ={aθ} = aθ − [aθ],

onde 1 ≤ a ≤ m. Note que se ri ≥ rj e i > j ent˜ao ri − rj = ri−j.

Analogamente, se ri ≥ rj e j > i ent˜ao 1− (ri− rj) = rj−i. Consideremos

tamb´em a seguinte parti¸c˜ao do intervalo [0, 1],

Ik= [

k m + 1,

k + 1

m + 1), com 0 ≤ k ≤ m − 1

e Im = [m+1m , 1]. Como temos m + 2 n´umeros reais em [0, 1] e a parti¸c˜ao de

[0, 1] tem m + 1 subintervalos, ent˜ao um desses intervalos, digamos Ik, tem

pelo menos dois dos n´umeros reais considerados. Se k = 0 ent˜ao existe um inteiro 1≤ a ≤ m tal que

ra≤

1

m + 1, i.e. |aθ − [aθ]| <

1

m + 1.

Se k = m ent˜ao existe um inteiro 1≤ a ≤ m tal que 1− ra≤

1

m + 1, i.e. |aθ − [aθ] − 1| ≤

1

m + 1.

Se 0 < k < m ent˜ao existem dois inteiros 1≤ i, j ≤ m tais que

ri− rj

1

m + 1.

Podem acontecer dois casos: Se i > j temos ri− rj = ri−j e

(i− j)θ − [(i − j)θ] ≤ 1

Se j > i temos 1− (ri− rj) = rj−i e

|(j − i)θ − [(j − i)θ] − 1| ≤ 1 m + 1.

2

Teorema 6.4. O m´etodo de Lehman est´a correcto e demora O(√3 n log2n) opera¸c˜oes bit.

Demonstra¸c˜ao: Suponhamos que o m´etodo est´a correcto, e de facto nos d´a um divisor de n ou prova que n ´e primo. Vejamos quantas opera¸c˜oes bit demora. A parte inicial de experimentar se n tem algum divisor menor que

3

n demora no m´aximo O(√3n log2n) pois para cada inteiro menor que 3 n

fazemos uma divis˜ao (se experiment´assemos s´o primos ter´ıamos um factor log n a menos). Caso tenhamos que passar `a segunda parte do m´etodo, temos que verificar

⌈√3nk=1 [ 6 n 4√k ] = O(√3n)

vezes se t2− 4kn ´e um quadrado perfeito (cada um demora O(log2n)). S´o no caso de obtermos um quadrado perfeito ´e que precisamos de calcular (d = t + s, n). Portanto, no total temos O(√3 n log2n) opera¸c˜oes bit.

Provemos agora que o m´etodo de Lehman est´a correcto. Podemos assumir que n n˜ao tem factores d 3 n. Se n n˜ao ´e primo ent˜ao n = pq com p, q > 3n. Vamos provar que existe um inteiro k ≤ [√3n] , k = uv com

No documento Criptografia e Segurança (páginas 73-91)

Documentos relacionados