Escolar Documentos
Profissional Documentos
Cultura Documentos
O esquema RSA
KeyGen
ϕ(n) = (p − 1)(q − 1)
Enc
e d ed
= (m ) = m mod n .
k
ϕ(n)
= (m ) m.
∗
Lembre do Teorema de Euler, que garante que para todo a ∈ Zn , vale que
ϕ
a (n) ≡ 1 mod (n).
Então:
k
ϕ(n)
Dec(c) = (m ) m
k
≡ (1) m mod n
= m mod n.
Geração de chaves
Faça n = pq
In [13]: n = p*q
print('n =', n)
n = 535453
Compute a função totiente de Euler
phi_n = 533628
In [15]: euler_phi(n)
Out[15]: 533628
A seguir vem a coisa mais importante dessa revisão pois o resto você acha em qualquer lugar.
Mas observe como ela é mais lenta do que para quem sabe os primos p e q:
Out[5]: 45211152
START = 10000000
END = 100000000
STEP = 10000000
NSAMPLES = 1000
data = {
'n': [],
'time_using_primes': [],
'time_without_using_primes': []
}
n = p*q
def compute_euler_phi_using_primes():
phi_n = p*q
time_using_primes = timeit.timeit(compute_euler_phi_using_
primes, number=10)
def compute_euler_phi_without_using_primes():
phi_n = euler_phi(n)
time_without_using_primes = timeit.timeit(compute_euler_ph
i_without_using_primes, number=1)
data['n'].append(n)
data['time_using_primes'].append(time_using_primes)
data['time_without_using_primes'].append(time_without_usin
g_primes)
return data
data = estimate_euler_phi_efficiency()
In [47]: %matplotlib notebook
import pandas as pd
df = pd.DataFrame.from_dict(data)
ax = plt.gca()
A moral da história é: quem não conhece p e q, dificilmente saberá calcular ϕ(n) , se n for suficientemente
grande.
Escolha aleatoriamente um e
e ∈ {1 < x < ϕ(n) : gcd(x, ϕ(n)) = 1}
In [20]: def choose_e(phi_n):
e = randint(1, phi_n)
while gcd(e, phi_n) != 1:
e = randint(1, phi_n)
return e
e = choose_e(phi_n)
print('Chave de encriptação e =', e)
Out[21]: 1
Dados a e b, o algoritmo de Euclides estendido nos devolve o gcd(a, b) e inteiros u e v tais que
ua + vb = gcd(a, b).
Note que
ue + vϕ(n) = 1 ⟹ ue = 1 mod ϕ(n).
In [45]: d = u
print('d =', d)
d = 140579
Out[41]: 1
Calcular a inversa mod é uma operação muito importante e já vem implementada no Sage:
In [43]: inverse_mod(e, phi_n)
Out[43]: 140579
Encriptação
In [49]: m = randint(1, n)
print(m)
430577
enc_m = 473622
Decriptação
In [62]: dec_m
Out[62]: 430577