square-ampersandRSA

Desencriptar RSA

En caso de tener la clave pública del archivo encriptado, en caso la clave sea mínima, por ejemplo:

-----BEGIN PUBLIC KEY-----
MD0wDQYJKoZIhvcNAQEBBQADLAAwKQIiANaV031/v8/EnUflRmq6MzASwwX2D1f6
hwS3zEvFdWYaRwIDAQAB
-----END PUBLIC KEY-----

Con Python y librerias como pycrypt se puede hacer marcha atrás al proceso y asi descubrir la llave privada, tal cual el siguiente ejemplo:

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()}')

Una vez con la llave ya obtenida, con openssl podemos proceder a ver lo que hay dentro del archivo.

Donde:

  • priv_key: Es la llave privada.

  • file.enc: Es el archivo encriptado.

Last updated