2009-03-30 31 views
38

De lo poco que entiendo leyendo material diferente, el par de claves pública-privada es la base del cifrado asimétrico y también algo sobre elegir 2 números primos (que es más o menos su clave privada) y multiplicarlos (que es aproximadamente su clave pública) , Parece que es posible generar una clave pública si conoce la clave privada. ¿Es correcto o estoy confundiendo algo?Dada una clave privada, ¿es posible derivar su clave pública?

[EDIT]

lo que me hizo más confuso era que no se puede serializar la clave RSA de XML con clave privada única (usando RSACryptoServiceProvider clase .NET). ¡No estoy seguro si esta limitación es intencional o no!

Respuesta

29

Eso depende del sistema de cifrado.

En RSA, hemos (citando a Wikipedia):

La clave pública consiste en el módulo n y el público (o cifrado) de base e. La clave privada consiste en el módulo ny el exponente privado d (o descifrado) que debe mantenerse en secreto.

Ahora, si tenemos nyd (la clave privada), solo nos falta e para la clave pública. Pero e es a menudo bastante pequeño (menos de tres dígitos), o incluso fijo (un valor común es 65537). En estos casos, obtener la clave pública es trivial.

Para curva elíptica Diffie-Hellman, la clave privada es d, y la clave pública dG (con G también es pública), por lo que es trivial también.

+1

En RSA, si conocemos dyn, podemos calcular p y q tal que pq = n. Con esto, dy e son el módulo inversos de cada uno (p-1) (q-1). –

+3

@Henno Bransma: ¿Cómo se calcula "p y q tal que pq = n"? – sleske

+1

@HennoBrandsma Saber * d * no ayuda a factorizar * n *, más que saber * e *. – erickson

-2

Teóricamente es posible, pero para teclas grandes no es computablemente factible.

+6

¿Puede explicar esto? – Hut8

1

Sí con acceso a la clave privada de la clave pública se puede generar

+0

¿Es (su respuesta) aplicable a RSA en general o específico para la implementación de Microsoft CryptoAPI (y la forma en que serializa la clave a/desde XML)? – Hemant

+1

En realidad, esto tampoco es cierto; ambos son productos de cálculos complejos. – AviD

+2

La pregunta se planteó originalmente en principio, de ahí que la respuesta esté en principio. No conozco las partes internas del cifrado .NET, sin embargo, las claves privadas pueden almacenar el origen pyq. Se debe suponer que una clave pública es derivable de una clave privada. – AnthonyWJones

3

En CUALQUIER sistema criptográfico de clave pública, la clave pública se relaciona matemáticamente con la clave privada. Es muy sencillo.

La clave pública se deriva de la clave privada en el momento de la generación, y con la clave privada en cualquier punto en el futuro es posible volver a derivar la clave pública fácilmente.

No es posible ir por el otro camino. Dada una clave pública, no es fácil derivar la clave privada. Es por eso que podemos compartir claves públicas de forma segura con otras personas. Si tiene suficientes ciclos de tiempo/CPU, podría forzarlo brutalmente, pero probablemente sea más fácil esperar un ataque matemático en la tecla.

+4

Necesita el totient para volver a derivar fácilmente la clave pública, pero la clave privada es solo el exponente privado y el módulo. Derivar el totient de esa información requiere factorizar números grandes, y no se conoce ningún algoritmo rápido. – erickson

7

Depende del algoritmo, y lo que quiere decir con "clave privada".

Las claves privadas de RSA a menudo se almacenan en su formulario "Teorema de resto chino". Por ejemplo, la estructura RSAPrivateKey definida en PKCS # 1 y reutilizada por muchos otros estándares de cifrado toma esta forma. Este formulario incluye los dos números secretos a menudo denotados p y q, a partir de los cuales se calcula el totient. Con totient y el exponente privado, el exponente público se calcula rápidamente.

En cualquier caso, la mayoría de los pares de claves RSA usan 65537 como el exponente público, y el módulo siempre se transporta como parte de la clave privada.

33

En la mayoría de las implementaciones de sistemas criptográficos asimétricos, lo único que está garantizado es que no puede encontrar la clave privada desde la clave pública. A la inversa, encontrar la clave pública desde la clave privada es trivial en la mayoría de los casos.

Por ejemplo, en RSA, puede crear la clave pública de la clave privada con:

openssl rsa -in private.pem -pubout -out public.pem 

Lo que es engañosa es la terminología: "clave privada" se refiere a 2 conceptos diferentes si va a hablar de la teoría o ya sea que se está hablando de la aplicación práctica:

  • el clave privada teórica es la pareja (d, n) que comparte perfecta simetría (matemática) ingenio relación h (e, n). Si está comparando estos, uno no puede ser calculado a partir del otro.
  • La práctica clave privada (como en la aplicación openssl por ejemplo), se refiere a un archivo que contiene (d, n) sino también varios valores intermedios importantes para propósito velocidad de decodificación. Además de eso, la parte teóricamente "desconocida" de la clave pública e a menudo se fija a valores comunes por convención (que es 0x10001 por defecto en openssl y aunque se puede cambiar, se recomienda encarecidamente que se adhiera a solo very specific values) Por lo tanto, deducir la clave pública (e, n) de la clave privada es trivial por más de un motivo.
+1

En PKCS # 8 no solo obtiene los valores para realizar los cálculos del Teorema de referencia chino (CRT) sino también el exponente público. Entonces, para las claves privadas de OpenSSL no tiene que deducir nada. Si no desea especificar el exponente de clave pública durante la generación de par de claves, entonces 'openssl' define el argumento' -f4' para usar el cuarto número de Fermat, que de hecho es 0x010001 (un número primo con solo dos bits configurados para 1 por razones de eficiencia, ya que es fácil de multiplicar con el valor 0) –

+1

Re 'openssl': la biblioteca ha admitido durante mucho tiempo cualquier pubexpt razonable. La línea de comando tradicional 'genrsa' se predetermina a' -f4' = 65537 y también admite '-3' = 3 (vea crypto.SX para varias Qs si e = 3 es bueno, malo o feo); desde la versión 1.0.0 en 2010, la línea de comando 'genpkey -algorithm RSA -pkeyopt rsa_keygen_pubexp: $ value' admite cualquier valor razonable. –

2

Para el caso específico de OpenSSH y ssh-keygen, sí se puede:

ssh-keygen -y

Esta opción va a leer un archivo de formato OpenSSH privada e imprimir una clave pública a stdout.


general, que depende del algoritmo y lo que la etiqueta de la clave privada. Sin embargo, cualquier implementación sensata incluirá la información completa (claves públicas y privadas) en el archivo secreto.

0

clave pública es el módulo N (y exponente público e, normalmente 65537), clave privada se da por los dos primos p, q (y el exponente privado d, a veces también partes CRT D_P, d_q de aceleración) esencialmente le tiene N = pq y e d = 1 mod ((p-1) (q-1)), también puede calcular d_p y d_q usando CRT clave privada dada, el cálculo del módulo de clave pública es una multiplicación "aburrida" y el exponente público está en especificación o se computa usando el algoritmo euclid extendido si el e estándar no era lo suficientemente bueno. clave pública dada, el cálculo de la clave privada requiere encontrar d (problema de RSA) o p, q (factorizar, ver el tamiz de campo numérico para obtener el mejor algoritmo para hacer esto). Estos problemas se muestran equivalentes bajo condiciones razonables [Breaking RSA genéricamente es equivalente a factoring, D. Aggarwal y U. Maurer, 2008]

0

Existe una idea errónea de lo que es la clave privada.La clave privada es solo el par (d, n) y, dado solo eso, no es factible generar la clave pública a menos que se pueda asumir que el exponente público es 65537, que es el caso en casi todas las claves rsa.

Si, por alguna razón, el exponente público es un número mayor, no puede crear la clave pública desde la privada.

Dicho esto, el valor almacenado como "clave privada" para archivos pem no es solo la clave privada, sino que también contiene los factores primos (entre otras cosas) y, por lo tanto, es fácil generar la clave pública a partir de ella.

Cuestiones relacionadas