Por lo que recuerdo, encriptaste el mensaje usando una clave pública y lo descifraste usando 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?

Comentarios

  • Esta clave ahora se ha filtrado a Internet y ya no es segura para su uso fuera de los ejemplos, para que te des cuenta.
  • » Aquí está la llave de mi casa. ¿Quién quiere hacer una copia? »
  • Espero que el OP genere una clave de ejemplo solo para usar en esta pregunta y luego la elimine inmediatamente.
  • @ basic6 » Aquí está la llave de mi casa. ¿Cómo puedo hacer un candado? »
  • Necesitas aclarar si ‘ preguntas sobre solo la clave privada (en cuyo caso la respuesta es no) o el archivo de clave privada , que por convención (como aquí) incluye ambas claves.

Respuesta

¿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 tener una idea de lo que contiene un archivo de clave, puede pasar la opción -text para ver un volcado de depuración legible por humanos (una especie de). 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: (…) 

Comentarios

  • @Pysis: esta respuesta no se trata de » encontrar » el público de la clave pública. Es simple que toda la información necesaria tanto para la parte privada como para la pública se almacena en el archivo de clave privada. En cambio, en el archivo de clave pública falta toda la información relacionada con la parte privada.
  • @Pysis Esto es cifrado asimétrico .
  • @Pysis Sí, el cifrado asimétrico es » ligeramente asimétrico «.
  • @SteffenUllrich Esa oración debe ser parte de tu respuesta
  • @Mehrdad: en el contexto de la seguridad de la información del mundo real, cualquier cosa que sea prácticamente inviable se considera inviable. La seguridad de la teoría de la información es irrelevante aquí, ya que supone una potencia informática ilimitada que simplemente no existe. Por lo tanto, falta toda la información relativa a la parte privada debe leerse ya que falta toda la información que haga posible en la práctica derivar la clave privada .

Responder

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 la clave pública correspondiente no pueda ser fácilmente obtenido, pero esto requeriría el uso de un método de generación de clave no estándar y un formato de almacenamiento de clave privada no estándar.


Repasemos rápidamente los conceptos básicos. Una clave pública RSA consta de dos valores:

  • el módulo n (un producto de dos números primos grandes p y q elegidos en secreto), y
  • el exponente público e (que puede ser el mismo para muchas claves y normalmente se elige como un número primo impar, por lo general 3 o 2 16 +1 = 6 5537).

Una clave privada RSA, mientras tanto, requiere como mínimo los siguientes dos valores:

  • 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 del módulo).

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

  • el exponente público e ,
  • los factores p y q del módulo,
  • los exponentes privados reducidos d p = 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 trivialmente 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 cualquiera de los exponentes para ser fácilmente calculado a partir del otro. Y, finalmente, incluso si no conociéramos los factores del módulo, para las claves RSA generadas de la forma habitual, simplemente podríamos probar los valores de e más utilizados y ver cuál de ellos genera textos cifrados que se pueden descifrar correctamente utilizando la clave privada dada.


Dicho todo esto, si usáramos un algoritmo de generación de claves RSA no estándar que eligiera e ( o d ) aleatoriamente del rango admisible de valores (es decir, los números enteros mayores que 1 y menores que y coprime con λ ( n ) = lcm ( p − 1, q − 1)), y si usamos 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 descifrar efectivamente la clave (es decir, factorizar el módulo).

De hecho, si se usa en un hombre tan no estándar ner, el algoritmo RSA se vuelve «simétrico» en el sentido de que ninguna de las claves ( n , e ) y ( n , d ) puede calcularse eficazmente a partir del otro y cualquiera de ellos podría designarse arbitrariamente como clave privada. En principio, si no permitía que el poseedor de la clave privada conociera la clave «pública» correspondiente (lo que, por supuesto, significa que ya no sería pública), entonces sólo podría descifrar los mensajes pero no cifrarlos. Por desgracia, la utilidad práctica de cualquier esquema de este tipo está bastante limitada por el simple hecho de que quien genere el par de claves inevitablemente terminará conociendo ambas mitades de todos modos.

Comentarios

  • Frunzo el ceño sobre la última oración. Como e se considera público de todos modos, sin olvidar e (y pyq) difícilmente se puede considerar una puerta trasera disponible para el propietario de la clave privada. (Y si un adversario obtiene la clave privada d, también tiene la clave pública e y ganó)
  • @HagenvonEitzen: El último párrafo se refiere al caso de uso (no estándar) donde e no es público ni pequeño. .
  • @HagenvonEitzen: De hecho, mencioné ese problema en la publicación de crypto.SE vinculada. Cualquier esquema que se base en la clave » pública » no se pueda derivar de la » privada » clave debe mantener necesariamente la clave » pública » secreta de al menos algunas partes ( y, por lo tanto, violar uno de los supuestos estándar de la criptografía de clave pública) para que esa característica sea de alguna utilidad. Pero puedo ver cómo ese párrafo puede haber sido engañoso; con suerte, la versión reescrita es al menos un poco más clara.
  • RSA tiene una propiedad matemática interesante de que el descifrado utiliza la misma fórmula que el cifrado, solo con d en lugar de e. Gracias a esto, puede intercambiar e y d (es decir, utilizar la clave privada para el cifrado y la pública para el descifrado). Luego obtienes el esquema de firma electrónica.

Respuesta

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

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

Si desea empaquetarlos en un formato PEM, consulte https://github.com/ius/rsatool

Comentarios

  • Enmarcado como una respuesta matemática, esto es incorrecto. Una clave privada podría tener solo nyd, y a partir de eso, es imposible en general para calcular e. Por lo general, ‘ es posible en la práctica solo porque e casi siempre se selecciona entre un puñado de valores. Enmarcado como una respuesta práctica, esto es incorrecto: e es, en la práctica, siempre se incluye con los otros parámetros (al menos nyd, generalmente también los parámetros necesarios para el cálculo basado en CRT).
  • De acuerdo, pero prácticamente RSA con CRT, las claves privadas generalmente se almacenan como una tupla de (n, e, d, p, q, dP, dQ, qInv) que es el caso aquí. Solo estaba tratando de configurar los componentes matemáticamente.
  • Sí: prácticamente, las claves privadas generalmente se almacenan como una tupla que contiene e . No es necesario calcular e.
  • @Gilles De la publicación: » una clave pública necesita n y e.» y del comentario de sudhackar ‘: » pero prácticamente RSA con claves privadas CRT son generalmente se almacena como una tupla de (n, e, d, p, q, dP, dQ, qlnv) «, lo que me lleva a la conclusión de que prácticamente, las claves privadas se almacenan como una tupla que contiene la clave privada . No es necesario calcular la clave privada, por lo que toda esta pregunta y todas sus respuestas son irrelevantes. No ‘ entiendo su comentario más reciente. sudhackar ‘ La respuesta es mostrar cómo encontrar el conjunto de posibles claves públicas a partir de la información menos útil posible.
  • @ wizzwizz4 Si tiene p, qyd , tiene más información que la menos útil posible para una clave privada. ‘ nunca he visto claves privadas con p, qyd pero no n y e. Necesita n para hacer algo útil con la clave y almacenar pyq en lugar de n no ‘ no obtiene almacenamiento.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *