RSA clave pública y longitudes de clave privada

24

Tengo problemas para comprender el tamaño de una clave pública RSA y su par de claves privadas.

Vi diferentes tamaños de clave para el algoritmo RSA (512, 1024, ... por ejemplo), ¿pero es la longitud de la clave pública o la longitud de la clave privada o ambas tienen la misma longitud?

Ya lo busqué, pero:

  1. En this cuestión, se menciona que tanto las claves privadas como las públicas para el algoritmo RSA tienen la misma longitud. Pero:
  2. En esta pregunta se menciona que tienen diferentes longitudes.

Se aceptan ambas respuestas. ¿Son iguales o no en longitud?

Además, mi applet de Java Card que genera pares de claves RSA, siempre devuelve la clave pública y la clave privada de igual longitud. ¡Las herramientas en línea para generar pares de claves RSA tienen una longitud de salida diferente!

Ejemplos:

herramienta en línea 1 :

Herramienta en línea 2 :

    
pregunta TheGoodUser 27.05.2015 - 10:08
fuente

2 respuestas

19

> Vi diferentes tamaños de clave para el algoritmo RSA (512, 1024, ... [bits] por ejemplo) pero, ¿es esta la longitud de la clave pública o la longitud de la clave privada o ambas tienen la misma longitud?

Es la longitud del módulo utilizado para calcular el par de claves RSA. La clave pública está hecha de módulo y exponente público, mientras que la clave privada está hecha de módulo y exponente privado.

> ¡pero las herramientas en línea para generar pares de claves RSA tienen diferentes longitudes de salida!

La primera imagen muestra la clave pública y privada en formato PEM, codificada en Base64 (y no el módulo y los exponentes de la clave, que en su lugar se muestran en la segunda imagen).

El contenido de la clave privada RSA es el siguiente:

-----BEGIN RSA PRIVATE KEY-----
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----

mientras que una clave pública RSA contiene solo los siguientes datos:

-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}
-----END RSA PUBLIC KEY-----

y esto explica por qué el bloque de clave privada es más grande.

Ahora, ¿por qué la clave privada contiene tanta información? Después de todo, solo se necesitan el módulo n y el exponente privado d . La razón por la que todas las demás cosas están precomputadas e incluidas en el bloque de claves privadas es para acelerar el descifrado mediante el uso de Algoritmo de Resto de China . (Felicitaciones a @dbernard por señalar esto en los comentarios).

Tenga en cuenta que un formato más estándar para las claves públicas que no son RSA es

-----BEGIN PUBLIC KEY-----
PublicKeyInfo ::= SEQUENCE {
  algorithm       AlgorithmIdentifier,
  PublicKey       BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
-----END PUBLIC KEY-----

Más información aquí .

Por cierto, ya que acaba de publicar una captura de pantalla de la clave privada, espero que sea solo para pruebas :)

    
respondido por el dr01 27.05.2015 - 14:00
fuente
11

Una clave pública RSA consiste en varios valores enteros (grandes), y una clave privada RSA consiste también en algunos valores enteros. Aunque los contenidos difieren, una clave pública RSA y la clave privada RSA correspondiente comparten una estructura matemática común y, en particular, ambas incluyen un valor específico denominado módulo . La clave pública y privada de un par dado necesariamente funciona con el mismo valor de módulo, de lo contrario, RSA no funciona (lo que se cifró con una clave pública debe descifrarse con la clave privada correspondiente ).

Tradicionalmente , la "longitud" de una clave RSA es la longitud, en bits, del módulo. Cuando se dice que una clave RSA tiene una longitud "2048", realmente significa que el valor del módulo se encuentra entre 2 2047 y 2 2048 . Dado que la clave pública y privada de un par dado comparten el mismo módulo, también tienen, por definición, la misma "longitud".

Sin embargo, tanto la clave pública como la privada contienen otros valores, además del módulo. Entonces, cuando codifique una clave pública o privada en bytes (para que puedan almacenarse en un archivo), necesitará algo más que los bytes para el módulo. Un módulo de 2048 bits teóricamente puede encajar en exactamente 256 bytes (desde 256 * 8 = 2048) pero necesita más bytes para codificar los otros valores.

Además, una clave pública RSA consiste en el módulo y otro valor llamado "exponente público", que suele ser bastante corto. Por lo tanto, una clave pública necesitará relativamente pocos bytes adicionales para la codificación; El módulo es la parte más grande en la clave pública. Esto no es así para la clave privada, que incluye el módulo y el exponente público (como la clave pública) sino también el "exponente privado" (un número aproximadamente tan grande como el módulo) y otros cinco valores cuyo tamaño es aproximadamente la mitad de la del módulo. La consecuencia es que se espera que una clave privada codificada sea aproximadamente cinco veces más grande (cuando se cuenta en bytes) que la clave pública codificada correspondiente.

Estas son solo consideraciones de codificación; la "longitud de la clave RSA" (como en "una clave de 2048 bits") se relaciona con el valor numérico del módulo, no con la longitud codificada de toda la parafernalia de factores y exponentes reducidos y coeficientes CRT.

    
respondido por el Thomas Pornin 27.05.2015 - 15:58
fuente

Lea otras preguntas en las etiquetas