web-dev-qa-db-fra.com

Octets de longueur de clé privée

Donc, je génère une paire de clés RSA 2048. Mais quand je regarde la clé privée, la longueur n'est que de 1232 octets. Est-ce que cela a quelque chose à voir avec le 2048 ou le 2048 est-il juste la taille du module?

42
hs2d

La taille d'une clé RSA est exprimée en bits, pas en octets. 2048 bits sont 256 octets.

Une clé privée RSA nue consiste en deux entiers, le module (un grand entier composite, sa longueur en bits est la "longueur de clé RSA") et exposant privé (un autre grand entier, qui a normalement le même taille que le module). Cependant, le module et l'exposant privé ont un peu de structure interne, et connaître les détails de cette structure permet des implémentations plus rapides (par un facteur d'environ 4). Par conséquent, les clés privées RSA incluent généralement quelques données supplémentaires.

A savoir, si le module est n et est le produit de deux nombres premiers p et q , alors la clé privée comprend:

  • le module n (256 octets pour une clé de 2048 bits)
  • l'exposant public e (petit, souvent 65537, c'est-à-dire pouvant être codé sur 3 ou 4 octets)
  • l'exposant privé d (environ 256 octets)
  • les facteurs p et q (128 octets chacun)
  • d modulo réduit p-1 (128 octets)
  • d modulo réduit q-1 (128 octets)
  • 1/q mod p (l'inverse de q modulo p ; 128 octets)

pour un grand total d'environ 1160 octets. Ensuite, il y a un peu de surcharge pour l'encodage, car tous ces entiers peuvent avoir des longueurs légèrement différentes (par exemple, rien ne nécessite vraiment que p et q ont exactement la même taille; e pourrait être supérieur à cela) . La structure standard utilise ASN.1, ce qui implique quelques octets supplémentaires ici et là. Il est également courant d'envelopper la structure dans une structure plus grande qui identifie également la clé comme étant une clé pour RSA. 1232 octets est compatible avec une clé RSA de 2048 bits codée au format PKCS # 8.

Pour plus de détails sur RSA, consultez PKCS # 1 .

60
Thomas Pornin

N'oubliez pas que 2048 est la longueur du module en bits, mais votre mesure de la clé privée est en octets. La clé privée est le module et l'inverse multiplicatif de l'exposant public, et selon la boîte à outils que vous utilisez, elle peut également stocker votre CN, DN (pour les clés x509) ou vos sous-clés (pour les clés GPG), il suffit donc de comparer les tailles peuvent ne pas être utiles.

1
sarnold

Outre les valeurs requises (dont le module est un, comme le souligne @sarnold) et le fait que vous comparez littéralement des bits et des octets, certaines implémentations calculent également quelques autres valeurs à l'avance et les stockent avec la clé, comme une optimisation. Par exemple, je ne suis pas certain mais je crois avoir lu que certaines implémentations stockent le produit (p-1)(q-1) (rappelons que le module n est en fait le produit pq, où p et q sont premiers).

0
a CVn

@Thomas Pornin, j'utilise à la fois ssh-keygen et openssl genpkey pour générer une paire de clés, chacune avec une taille de clé de 2048, puis j'imprime le contenu, c'est comme ceci:

Private-Key: (2048 bit)
modulus:
    00:bd:92:7f:da:4f:8f:b0:33:23:0f:d7:f4:12:39:
    5d:4d:32:48:1b:6e:de:2d:a5:b9:83:7f:d2:f2:dc:
    39:c5:f3:6f:6a:5f:8a:9d:21:9c:01:51:a7:22:99:
    70:0d:03:2e:12:63:f2:44:5f:a7:6e:cc:df:44:d9:
    8b:b2:7e:fd:8c:c3:ae:62:3e:1e:7e:7a:89:1d:94:
    de:86:24:36:d6:f8:23:32:aa:4d:dc:c7:44:87:9d:
    68:a5:31:f4:ff:a3:ff:9d:01:57:c9:82:9b:9b:e1:
    1c:0f:45:2b:0f:f2:ce:95:4c:13:fb:e9:99:19:82:
    64:97:18:77:13:bb:a9:8c:1f:a1:02:cf:92:1a:4d:
    13:16:55:8d:06:a8:32:8b:43:80:12:a4:98:77:a7:
    cb:7b:4f:e7:be:4e:eb:7b:52:1f:04:49:c9:03:5a:
    5b:70:f8:db:c7:8c:99:62:32:cd:3f:fc:70:7f:5e:
    de:e9:52:04:f6:19:df:c7:21:bd:28:d8:31:e1:43:
    27:ff:ce:43:3a:83:9e:97:69:93:35:46:1f:7f:1d:
    4a:43:7f:7f:be:fd:62:c6:f8:a3:9e:07:df:75:4b:
    08:4a:47:59:e6:b3:e2:d8:40:29:d4:de:88:54:f5:
    6b:e6:e8:77:d5:71:73:c0:1c:0e:8a:b1:ad:25:82:
    79:05
publicExponent: 65537 (0x10001)
privateExponent:
    42:98:a7:9f:9a:d9:a0:8d:a6:60:97:7d:df:b5:15:
    48:dc:44:26:97:01:28:4a:12:ec:d6:47:d6:17:75:
    98:4b:d7:b5:27:d1:3b:38:26:64:f4:39:61:d7:43:
    5c:de:e4:1d:83:cd:05:26:11:5c:c4:4e:1f:12:c9:
    97:b0:33:04:73:6d:dc:87:74:10:fc:9d:14:ae:4a:
    aa:17:28:c8:c6:2d:1f:4c:62:c4:0f:a0:cc:7f:88:
    d6:97:c1:38:d9:75:1f:c3:ec:02:17:86:f0:f0:d8:
    f9:a8:53:e3:6b:6a:15:5a:bf:9e:7c:c6:d3:06:52:
    ae:1d:e3:1f:24:8b:00:75:33:ee:aa:b0:69:52:a4:
    07:41:60:35:34:67:10:ac:40:b3:5b:70:d7:a7:9c:
    c5:aa:08:2e:f5:7b:64:4f:8d:ff:ca:f9:2e:5e:4c:
    a9:ef:74:74:18:9b:14:c5:96:ce:70:43:18:ff:2d:
    25:d6:5a:15:15:11:dc:e9:6e:98:ea:b0:1d:73:d0:
    73:e2:5c:e7:f9:b8:03:a8:8d:1f:81:ca:87:97:b5:
    82:3a:f2:71:15:0c:34:1f:63:8d:b8:03:99:6f:e7:
    4d:c0:b7:c9:9a:63:60:10:af:7a:5b:db:df:aa:a3:
    81:8e:6c:44:b0:77:ee:33:0c:00:e1:67:a8:e1:8d:
    61
...
...

Donc, l'exposant privé est le 256 octets (2048 bits), pas le module, n'est-ce pas?

0
gpanda