Модуль RSA с префиксом 0x00

    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim:  INTEGER           :BDF2C14F11E80EEC62EE63135839DBD8C9140617CD497AB2E0E39E6A0CE75889B46D7EA2BE11ED8D5E05941F9BCF066E1DA9D176D32B22AD34F8F9055680F01F156AD4CAF288FBDF0BB03C1E58ADDFB8DFBC4870C18B38BAB0B3B35757BC10D662E3AD113387348E48E1B46E2DB0041BECA6DFD323EC6D204D7F9B875B9E6C51A1B37E3019D03DB71584F83ED300CC471B42D5C5F1CBD54D884A04A4CD4ABAB87B48C0BDAC4E32DE4B1EB238A3C979CFF07808511D7A4EC5898A2ED93C3BA36661FA14E252BCBDC0876C41D02FBB0B97CD1963A6CB09B274A9D395E93177A6DD00BE3B7C3AC89E53E84829E5B1E0F4048485EE09AE6711791B0B6107F6106423
  265:d=1  hl=2 l=   3 prim:  INTEGER           :010001

$ echo -n 'BDF2C14F11E80EEC62EE63135839DBD8C9140617CD497AB2E0E39E6A0CE75889B46D7EA2BE11ED8D5E05941F9BCF066E1DA9D176D32B22AD34F8F9055680F01F156AD4CAF288FBDF0BB03C1E58ADDFB8DFBC4870C18B38BAB0B3B35757BC10D662E3AD113387348E48E1B46E2DB0041BECA6DFD323EC6D204D7F9B875B9E6C51A1B37E3019D03DB71584F83ED300CC471B42D5C5F1CBD54D884A04A4CD4ABAB87B48C0BDAC4E32DE4B1EB238A3C979CFF07808511D7A4EC5898A2ED93C3BA36661FA14E252BCBDC0876C41D02FBB0B97CD1963A6CB09B274A9D395E93177A6DD00BE3B7C3AC89E53E84829E5B1E0F4048485EE09AE6711791B0B6107F6106423' | wc
      0       1     512

Выше показан 2048-битный ключ RSA, сгенерированный OpenSSL. Обратите внимание, что длина поля модуля равна «257». Если вы подсчитаете шестнадцатеричные символы, напечатанные для модуля, вы увидите, что это соответственно 512 = 256 * 2. В ASN1 перед модулем стоит 0x00. Поскольку модуль является целым числом, это не влияет на математику RSA. Но почему оно там? 0x00 также можно увидеть в сертификатах X509, предшествующих значению открытого ключа. Какова цель этих дополнительных 0x00?


person GHW    schedule 11.04.2013    source источник


Ответы (1)


Это из-за кодирования ASN.1. Насколько я помню, ЦЕЛЫЕ числа там знаковые, поэтому, когда они начинаются с байта выше 0x80, их следует рассматривать как отрицательные числа, поэтому они имеют префикс 0x00.

person Nickolay Olshevsky    schedule 11.04.2013
comment
Похоже, вы правы в том, что это связано с ASN1. Целые числа могут быть отрицательными, используя тот же формат, что и целые числа в C. Похоже, дополнительные 0x00 в начале битовых строк описывают количество неиспользуемых битов в конце строки. - person GHW; 12.04.2013
comment
когда вы видите 0x00 перед целым числом в ASN1, это потому, что целые числа могут быть отрицательными, поэтому 0x00 впереди гарантирует, что бит знака не установлен - person GHW; 12.04.2013
comment
когда вы видите его в битовых строках, например перед открытым ключом в сертификате, он описывает, сколько неиспользуемых БИТОВ находится в конце (потому что вы можете кодировать любое количество битов, не кратное 8) - person GHW; 12.04.2013