Закрытый ключ в формате ASN.1 DER - PullRequest
11 голосов
/ 12 мая 2011

Почему модуль дополняется ведущими нулями?Я читал PKCS # 1 и PKCS # 8, но ничего не нашел об этом.В c # ведущие нули должны быть удалены, кто-нибудь знает почему?

При http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html, вы можете видеть, что модуль и показатель степени имеют ведущие нули.Вопрос в том, почему они это имеют, я нигде не нашел объяснения.

1 Ответ

20 голосов
/ 22 мая 2011

Значения закрытого ключа кодируются как целые числа ASN.1, которые являются знаковыми значениями в формате дополнения до двух. Начальный нулевой байт необходим, когда установлен MSB (без знака) значения ключа RSA. Установка MSB без начального нулевого байта будет означать отрицательное значение.

Спецификации ASN.1 бесплатны и связаны с Wikipedia . Соответствующий раздел здесь находится в X.690, «8.3 Кодирование целочисленного значения».

Я приведу пример на случай, если связанная страница исчезнет.

Если у вас есть openssl, вы можете сгенерировать тестовые ключи с помощью:

openssl genrsa -out test.pem 512
openssl rsa -in test.pem -out test.der -outform der

Вот пример данных из test.der:

30 82 01 3b
ASN.1 SEQUENCE, длина 0x13b, содержимое следует

02 01 00
версия: ASN.1 INTEGER, сохраненная длина 1, значение 0

02 41 00 c0 8e ... (65 байтов данных)
модуль: ASN.1 INTEGER, сохраненная длина 65, значение 0xc08e ... (требуется начальный нулевой байт, потому что модуль> 2 ^ 511)

02 03 01 00 01
открытый показатель: 0x10001 (начальный нулевой байт не требуется, поскольку показатель <2 ^ 23) </p>

02 41 00 b5 87 ... (65 байтов данных)
частный показатель: 0xb587 ...

02 21 00 e7 18 ... (33 байта данных)
prime1: 0xe718 ...

02 21 00 d5 43 ... (33 байта данных)
prime2: 0xd543 ...

02 20 75 67 a1 ... (32 байта данных)
exponent1: 0x7567 ... (начальный нулевой байт не требуется, поскольку показатель степени <2 ^ 255) </p>

02 20 0a f6 3f ... (32 байта данных)
экспонента2: 0x0af6 ...

02 21 00 c7 13 ... (33 байта данных)
коэффициент: 0xc713 ...

...