RSA
Desencriptar RSA
-----BEGIN PUBLIC KEY-----
MD0wDQYJKoZIhvcNAQEBBQADLAAwKQIiANaV031/v8/EnUflRmq6MzASwwX2D1f6
hwS3zEvFdWYaRwIDAQAB
-----END PUBLIC KEY-----from Crypto.PublicKey import RSA
f = open('public.key', 'r') # Leer la llave pública
key = RSA.importKey(f.read()) # Importarla en la libreria RSA
# La libreria extrae por defecto el valor
# tanto de "e" como de "n"
e = key.e
n = key.n
# Con sitios como https://factordb.com , se puede factorizar
# el valor de "n" y descubrir asi el valor de "p" y "q"
p = 123
q = 456
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
# Funcion modular inversa multiplicativa modular
# que nos retorna el valor de "d"
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m
m = n-(p+q-1) # Fórmula para hallar "m" y proceder asi con descubrir "d"
d = modinv(e, m)
print(f'p: {p}')
print(f'q: {q}')
print(f'p*q={p*q}')
print(f'e: {e}')
print(f'n: {n}')
print(f'm: {m}')
print(f'd: {d}')
# Con todos los valores cargados, podemos procedera a extraer
# la llave privada
privateKey = RSA.construct((n, e, d, p, q))
# Y la procedemos a imprimir, del objeto que tenemos previamente
# que decodear para obtener la llave en texto claro
print(f'\n{privateKey.exportKey().decode()}')Last updated