Закрытые байты длины ключа

Итак, im создает 2048 RSA-клавиатуру. Но когда я смотрю на закрытый ключ, длина составляет всего 1232 байта. Имеет ли это какое-либо отношение к 2048 или 2048 - только размер модуля?

Ответ 1

Размер ключа RSA выражается в битах, а не в байтах. 2048 бит - 256 байтов.

Закрытый ключ RSA с открытым кодом состоит из двух целых чисел: модуля (большого составного целого числа, его длины в битах - "длина ключа RSA" ) и частного экспонента (другое большое целое число, которое обычно имеет одинаковый размер чем модуль). Тем не менее, модуль и частный экспонент имеют немного внутренней структуры, и знание сведений об этой структуре позволяет ускорить реализацию (в 4 раза). Следовательно, секретные ключи RSA обычно включают в себя несколько данных.

А именно, если модуль равен n и является произведением двух простых чисел p и q, то закрытый ключ включает в себя:

  • модуль n (256 байтов для 2048-битного ключа)
  • общий показатель e (маленький, часто 65537, т.е. может быть закодирован более чем на 3 или 4 байта).
  • частный показатель d (около 256 байт)
  • коэффициенты p и q (по 128 байт)
  • d уменьшен по модулю p-1 (128 байтов)
  • d приведено по модулю q-1 (128 байт)
  • 1/q mod p (обратный к q по модулю p; 128 байтов)

для общей суммы около 1160 байт. Тогда для кодировки есть немного накладных расходов, потому что все эти целые числа могут иметь несколько разную длину (например, ничто действительно не требует, чтобы p и q имели одинаковый размер, а также e мог быть больше этого). Стандартная структура использует ASN.1, что подразумевает несколько дополнительных байтов здесь и там. Также распространено преобразование структуры в более крупную структуру, которая также идентифицирует ключ как ключ к RSA. 1232 байт совместим с 2048-битным ключом RSA, закодированным в формате PKCS # 8.

Подробнее о RSA см. PKCS # 1.

Ответ 2

Не забывайте, что 2048 - это длина модуля в битах, но ваше измерение закрытого ключа находится в байтах. Частный ключ - это модуль и мультипликативный инверсный показатель для публичного экспонента, и в зависимости от используемого инструментария он может также хранить ваши CN, DN, (для ключей x509) или подразделы (для ключей GPG), поэтому просто сравнение размеры не могут быть полезны.

Ответ 3

Помимо требуемых значений (из которых модуль равен единице, как указывает @sarnold) и тот факт, что вы буквально сравниваете биты и байты, некоторые реализации также вычисляют несколько других значений спереди и сохраняют их вместе с ключ, как оптимизация. Например, я не уверен, но я уверен, что я читал, что некоторые реализации сохраняют продукт (p-1)(q-1) (напомним, что модуль n на самом деле является произведением pq, где p и q простые).

Ответ 4

@Томас Порнин, Я использую как ssh-keygen, так и openssl genpkey для генерации пары ключей, каждая с 2048 ключами, а затем распечатывает содержимое, это примерно так:

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

Итак, частный показатель - это 256 байтов (2048 бит), а не модуль, не так ли?