Учитывая документ PEM, можно ли узнать формат байтов из него или нужна информация априори?

Учитывая произвольный (действительный!) закрытый или открытый ключ, закодированный внутри PEM, с неповрежденными pre-encapsulation boundary и post-encapsulation boundaries, можно ли точно знать, какой формат принимают байты (т. е. они являются традиционными для OpenSSL, PKCS8, X.509 SubjectPublicKeyInfo и т. д.). .), или для их правильного декодирования нужна какая-то априорная информация?


person Alex Gaynor    schedule 14.07.2014    source источник
comment
BEGIN SOMETHING граница — это намек на то, что содержимое, вероятно, НЕЧТО, но оно не является обязывающим, а это означает, что читатель PEM не должен предполагать конкретное содержимое на основе граничного заголовка и должен просто использовать границу, чтобы узнать границы документа.   -  person Oleg Estekhin    schedule 14.07.2014


Ответы (2)


С сертификатами ситуация почти прямолинейна — там граница указывает, что ожидается (сертификат или закрытый ключ).

В бронированных данных OpenPGP линия границы также сообщает вам, что ожидается - ключ(и) или данные.

Ключи SSH, созданные несколькими приложениями SSH, имеют одинаковые границы, но разный формат самого ключа. Поэтому вам нужно попробовать прочитать данные во всех ожидаемых форматах.

Открытые ключи RSA обычно имеют формат RSA 1.5, поэтому вы можете предположить, что у вас есть ключ RSA.

PKCS#12 обычно не запаковывается в PEM (я таких файлов не видел). То же самое касается PKCS8.

Хранилища сертификатов PKCS#7 иногда имеют кодировку PEM, и в их граничной строке есть что-то вроде BEGIN CERTIFICATE STORAGE.

Подводя итог - в какой-то степени вы можете полагаться на текст ограничительной линии, но это не дает вам 100% гарантии.

person Eugene Mayevski 'Callback    schedule 14.07.2014

Вам следует взглянуть на спецификацию, PKCS#8 указан в RFC5958 в Раздел 5

Когда файлы .p8 кодируются PEM, они используют расширение файла .pem. Кодировка PEM представляет собой либо кодировку Base64 EncryptedPrivateKeyInfo, закодированную в DER, зажатую между:

-----НАЧАТЬ ЗАШИФРОВАННЫЙ ЗАКРЫТЫЙ КЛЮЧ-----
-----КОНЕЦ ЗАШИФРОВАННЫЙ ЗАКРЫТЫЙ КЛЮЧ-----

или кодировку Base64, см. раздел 4 [RFC4648], закодированного в DER PrivateKeyInfo, зажатого между:

-----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ-----
-----КОНЕЦ ЗАКРЫТОГО КЛЮЧА----

Немного более длинный ответ: «Между тегами в любом случае действует кодировка Base64, закодированная DER, закодированная ASN.1»

person skat    schedule 29.08.2019