Закрытый ключ в формате ASN.1 DER

#asn.1 #pkcs#8 #pkcs#1

#asn.1 #pkcs #8 #pkcs #1

Вопрос:

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

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

Ответ №1:

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

Спецификации ASN.1 бесплатны и взяты из Википедии. Соответствующий раздел здесь находится в 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, длина 0x13b, содержимое следует

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

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

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

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 байта данных)
показатель 1: 0x7567… (начальный нулевой байт не требуется, поскольку показатель степени равен < 2 ^ 255)

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

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

Комментарии:

1. Ваш ответ очень хорошо объяснен. Использование openssl для демонстрации объяснения было полезным.

2. обратите внимание, что целочисленные выборки ASN.1 DER могут быть сгенерированы с помощью openssl, например: x=128; openssl asn1parse -genstr "INTEGER:$x" -noout -out data amp;amp; hexdump -C data