Longueur des clés privées octets
donc je générais 2048 porte-clés RSA. Mais quand je regarde la clé privée de la longueur est seulement 1232 octets. Est-ce que cela a quelque chose à voir avec le 2048 ou est-ce que le 2048 est juste la taille du module?
4 réponses
la taille d'une clé RSA est exprimée en bits et non en octets. 2048 bits sont de 256 octets.
une clé privée RSA sans os se compose de deux entiers, le module (un grand entier composite, sa longueur en bits la "longueur de clé RSA") et le privé exposant (un autre grand entier, qui a normalement la 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 sur cette structure permet des implémentations plus rapides (par un facteur d'environ 4). Par conséquent, les clés privées RSA contiennent généralement plus de données.
à Savoir si le module est n et est le produit de deux nombres premiers p et q, alors la clé privée inclut:
- le module n (256 octets pour une clé de 2048 bits)
- l'exposant public e (petit, souvent 65537, i.e. peut être encodé plus de 3 ou 4 octets)
- le privé exposant d (environ 256 octets)
- les facteurs p et q (128 octets)
- 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 total global de environ 1160 octets. Ensuite, il y a un peu de overhead pour l'encodage, parce que tous ces entiers pourraient avoir des longueurs légèrement différentes (par exemple, rien ne nécessite vraiment que p et q ont la même taille; aussi, e pourrait être plus grand que cela). La structure standard utilise L'ASN.1, ce qui implique quelques octets supplémentaires ici et là. Il est également fréquent pour envelopper la structure dans une structure plus grande, qui identifie également la clé comme clé RSA. 1232 octets est compatible avec une clé RSA de 2048 bits encodée dans le format PKCS#8.
pour plus de détails sur RSA, voir PKCS#1.
N'oubliez pas que 2048
est la longueur du module 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, il peut également stocker votre CN, DN, (pour les clés x509) ou subkeys (pour les clés GPG), donc juste comparer les tailles peut ne pas être utile.
outre les valeurs requises (dont le module fait partie, comme @sarnold le souligne) et le fait que vous comparez littéralement bits et octets, certaines implémentations calculent aussi quelques autres valeurs à l'avance et les stockent avec la clé, comme une optimisation. Par exemple, Je ne suis pas certain mais je crois que j'ai lu que certaines implémentations stockent le produit (p-1)(q-1)
(rappelons que le module n
est le produit pq
, où p et q sont premiers).
@Thomas Pornin, J'utilise à la fois ssh-keygen et openssl genpkey pour générer un clavier, chacun avec 2048 keysize, et ensuite imprimer 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 est l'256bytes(2048bits), pas le module, n'est-ce pas?