Ответ 1
Значения секретного ключа кодируются как ASN.1 INTEGER, которые являются значениями в формате двух дополнений. Ведущий нулевой байт необходим, когда установлен 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
public exponent: 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 байта данных)
exponent1: 0x7567... (ведущий нулевой байт не требуется, потому что показатель равен < 2 ^ 255)
02 20 0a f6 3f ...
(32 байта данных)
exponent2: 0x0af6...
02 21 00 c7 13 ...
(33 байта данных)
коэффициент: 0xc713...