¿Puedo obtener una clave pública de una clave privada RSA?

44

Por lo que recuerdo, encripta el mensaje con una clave pública y descifra con una clave privada. Mi pregunta es si es posible obtener una clave pública de una clave privada RSA. Por ejemplo, si tengo una clave como esta:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE
Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q
j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB
AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d
CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z
NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf
tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW
NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK
t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9
am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz
TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu
xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1
V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g==
-----END RSA PRIVATE KEY-----

¿Puedo obtener una clave pública?

    
pregunta user162408 27.10.2017 - 08:30
fuente

3 respuestas

60
  

¿Puedo obtener una clave pública?

Es fácil usar openssl rsa :

$ openssl rsa -in the-private-key-from-your-question.pem  -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU
C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j
3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW
toeLfxDBL2AJ20qXzQIDAQAB
-----END PUBLIC KEY---

Si desea obtener una idea de lo que está contenido en un archivo de clave, puede pasar la opción -text para ver un volcado de depuración legible por el usuario. De esta manera puede ver que un archivo de clave contiene tanto información privada como información pública. Especialmente contiene el módulo y publicExponent que describen completamente la clave pública:

$ openssl rsa -text -in the-private-key-from-your-question.pem
Private-Key: (1024 bit)
modulus:
    00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee:
    29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b:
    01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49:
    4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97:
    ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24:
    6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe:
    e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e:
    1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f:
    10:c1:2f:60:09:db:4a:97:cd
publicExponent: 65537 (0x10001)
privateExponent:
(…)
    
respondido por el Steffen Ullrich 27.10.2017 - 08:40
fuente
28

En la práctica, sí, puede obtener la clave pública de la clave privada. En principio, sería posible crear una clave privada RSA a partir de la cual no se pueda obtener la clave pública correspondiente, pero esto requeriría usar un método de generación de claves no estándar y un privado no estándar. formato de almacenamiento de claves.

Repasemos rápidamente lo básico. Una clave pública RSA consta de dos valores:

  • el módulo n (un producto de dos primos grandes seleccionados en secreto p y q ), y
  • el exponente público e (que puede ser el mismo para muchas teclas y normalmente se elige como un primo impar pequeño, generalmente 3 o 2 16 +1 = 65537).

Mientras tanto, una clave privada RSA requiere como mínimo los dos valores siguientes:

  • el módulo n (igual que en la clave pública), y
  • el exponente privado d (calculado a partir del exponente público e y los factores p y q de la módulo).

Sin embargo, la mayoría de los formatos para almacenar claves privadas RSA, incluido el formato PKCS1 RSAPrivateKey que se muestra en su pregunta, en realidad almacena una montón de valores adicionales, incluyendo:

  • el exponente público e ,
  • los factores p y q del módulo,
  • los exponentes privados reducidos dp = d mod ( p - 1) y dq = d mod ( q - 1), y
  • el "Coeficiente CRT" q inv = q −1 mod p .

En particular, la inclusión del exponente público e en el formato de clave privada significa que la clave pública se puede extraer de forma trivial de un archivo de clave privada compatible con PKCS1. Además, incluso si el exponente público e no se incluyó en el archivo de clave privada, conocer los factores p y q del módulo permite que ambos exponentes Se calcula fácilmente a partir del otro. Y, finalmente, incluso si no conociéramos los factores del módulo, para las claves RSA generadas de la manera habitual, podríamos simplemente probar los valores más utilizados de e y ver cuál de ellos genera ciphertexts que se pueden descifrar correctamente usando la clave privada dada.

Todo lo dicho, si tuviéramos que utilizar un algoritmo de generación de claves RSA no estándar que eligiera e (o d ) al azar del rango admisible de valores (es decir, los enteros mayores que 1 y menores que y coprime con λ ( n ) = lcm ( p - 1, q - 1)), y si utilizamos un formato de clave privada RSA no estándar que solo almacena la información mínima para el descifrado (es decir, n y d ), entonces no sería posible calcular la clave pública a partir de la clave privada sin romper la clave de forma efectiva (es decir, factorizar el módulo).

De hecho, si se usa de tal manera no estándar, el algoritmo RSA se vuelve "simétrico" en el sentido de que ninguna de las teclas ( n , e ) y ( n , d ) puede calcularse efectivamente a partir de la otra y cualquiera de las dos podría designarse arbitrariamente como la clave privada. En principio, si no le dijiste al titular de la clave privada la clave "pública" correspondiente (lo cual, por supuesto, significa que ya no sería más público), entonces solo podrían descifrar los mensajes pero no cifrarlos. Por desgracia, la utilidad práctica de cualquiera de estos esquemas está bastante limitada por el simple hecho de que quienquiera que genere el par de claves terminará inevitablemente conociendo ambas mitades de todos modos.

    
respondido por el Ilmari Karonen 27.10.2017 - 19:16
fuente
3

Sí. Es bastante fácil también. Si observa la especificación RSA, una clave pública necesita n y e . Una clave privada puede tener p q d . Usa estos para calcular.

n=p*q
e=mod_inverse(d,euler_totient(n))

Si desea volver a empaquetarlos en un formato PEM, consulte enlace

    
respondido por el sudhackar 27.10.2017 - 08:34
fuente

Lea otras preguntas en las etiquetas