web-dev-qa-db-fra.com

Longueur de clé publique et de clé privée RSA

J'ai un problème pour comprendre la taille d'une clé publique RSA et sa paire de clés privées.

J'ai vu différentes tailles de clés pour l'algorithme RSA (512, 1024, ... par exemple), mais est-ce la longueur de la clé publique ou la longueur de la clé privée ou sont-elles toutes deux de même longueur?

Je l'ai déjà cherché, mais:

  1. Dans la question this , il est mentionné que les clés privées et publiques de l'algorithme RSA ont une longueur égale. Mais:
  2. Dans cette question, il est mentionné qu'ils ont des longueurs différentes!

Les deux réponses sont acceptées. Sont-ils égaux ou non en longueur?

De plus, mon Java applet de carte qui génère des paires de clés RSA, renvoie toujours la clé publique et la clé privée de longueur égale. Les outils en ligne pour générer des paires de clés RSA ont une longueur différente!

Exemples:

Outil en ligne 1 :

enter image description here

Outil en ligne 2 :

enter image description here

30
TheGoodUser

> J'ai vu différentes tailles de clés pour l'algorithme RSA (512, 1024, ... [bits] par exemple) mais, est-ce la longueur de la clé publique ou la longueur de la clé privée ou les deux sont de longueur égale?

C'est la longueur du module utilisé pour calculer la paire de clés RSA. La clé publique est constituée de module et d'exposant public, tandis que la clé privée est constituée de module et d'exposant privé.

> mais les outils en ligne pour générer des paires de clés RSA ont des longueurs différentes!

La première image montre la clé publique et privée au format PEM, encodée en Base64 (et non le module et les exposants de la clé, qui sont plutôt affichés dans la deuxième image).

Le contenu de la clé privée RSA est le suivant:

-----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-----

tandis qu'une clé publique RSA contient uniquement les données suivantes:

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

et cela explique pourquoi le bloc de clé privée est plus grand.

Maintenant, pourquoi la clé privée contient-elle autant de données? Après tout, seuls le module n et l'exposant privé d sont nécessaires . La raison pour laquelle tous les autres éléments sont précalculés et inclus dans le bloc de clé privée est d'accélérer le décryptage à l'aide de Chinese Remainder Algorithm . (Félicitations à @dbernard pour l'avoir signalé dans les commentaires.)

Notez qu'un format plus standard pour les clés publiques non RSA est

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

Plus d'informations ici .

BTW, puisque vous venez de poster une capture d'écran de la clé privée, j'espère fortement que c'était juste pour des tests :)

28
dr_

Une clé publique RSA se compose de plusieurs (grandes) valeurs entières, et une clé privée RSA se compose également de quelques valeurs entières. Bien que le contenu diffère, une clé publique RSA et la clé privée RSA correspondante partagent une structure mathématique commune et, en particulier, toutes deux incluent une valeur spécifique appelée module . Les clés publique et privée d'une paire donnée fonctionnent nécessairement sur la même valeur de module, sinon RSA ne fonctionne pas (ce qu'il a chiffré avec une clé publique doit être déchiffré avec le correspondant clé privée).

Traditionnellement, la "longueur" d'une clé RSA est la longueur, en bits, du module. Lorsqu'une clé RSA est censée avoir une longueur "2048", cela signifie vraiment que la valeur du module se situe entre 22047 et 22048. Puisque la clé publique et la clé privée d'une paire donnée partagent le même module, elles ont également, par définition, la même "longueur".

Cependant, la clé publique et la clé privée contiennent d'autres valeurs, outre le module. Ainsi, lorsque vous encodez une clé publique ou privée en octets (afin qu'ils puissent être stockés dans un fichier), vous aurez besoin de plus que les octets du module. Un module de 2048 bits peut théoriquement tenir sur exactement 256 octets (puisque 256 * 8 = 2048) mais vous avez besoin de plus d'octets pour coder les autres valeurs.

De plus, une clé publique RSA se compose du module et d'une autre valeur appelée "exposant public", qui est généralement assez courte. Ainsi, une clé publique nécessitera relativement peu d'octets supplémentaires pour l'encodage; le module est le plus gros morceau de la clé publique. Ce n'est pas le cas pour la clé privée, qui comprend le module et l'exposant public (comme la clé publique) mais aussi l '"exposant privé" (un nombre à peu près aussi grand que le module) et cinq autres valeurs dont la taille est à peu près la moitié de celle du module. La conséquence est qu'une clé privée codée devrait être environ cinq fois plus grande (lorsqu'elle est comptée en octets) que la clé publique codée correspondante.

Ce ne sont que des considérations d'encodage; la "longueur de clé RSA" (comme dans "une clé de 2048 bits") se rapporte à la valeur numérique du module, pas à la longueur codée de tout l'attirail de facteurs et d'exposants réduits et de coefficients CRT.

14
Thomas Pornin