Учитывая произвольный (действительный!) закрытый или открытый ключ, закодированный внутри PEM, с неповрежденными pre-encapsulation boundary
и post-encapsulation boundaries
, можно ли точно знать, какой формат принимают байты (т. е. они являются традиционными для OpenSSL, PKCS8, X.509 SubjectPublicKeyInfo
и т. д.). .), или для их правильного декодирования нужна какая-то априорная информация?
Учитывая документ PEM, можно ли узнать формат байтов из него или нужна информация априори?
Ответы (2)
С сертификатами ситуация почти прямолинейна — там граница указывает, что ожидается (сертификат или закрытый ключ).
В бронированных данных OpenPGP линия границы также сообщает вам, что ожидается - ключ(и) или данные.
Ключи SSH, созданные несколькими приложениями SSH, имеют одинаковые границы, но разный формат самого ключа. Поэтому вам нужно попробовать прочитать данные во всех ожидаемых форматах.
Открытые ключи RSA обычно имеют формат RSA 1.5, поэтому вы можете предположить, что у вас есть ключ RSA.
PKCS#12 обычно не запаковывается в PEM (я таких файлов не видел). То же самое касается PKCS8.
Хранилища сертификатов PKCS#7 иногда имеют кодировку PEM, и в их граничной строке есть что-то вроде BEGIN CERTIFICATE STORAGE.
Подводя итог - в какой-то степени вы можете полагаться на текст ограничительной линии, но это не дает вам 100% гарантии.
Вам следует взглянуть на спецификацию, PKCS#8 указан в RFC5958 в Раздел 5
Когда файлы .p8 кодируются PEM, они используют расширение файла .pem. Кодировка PEM представляет собой либо кодировку Base64 EncryptedPrivateKeyInfo, закодированную в DER, зажатую между:
-----НАЧАТЬ ЗАШИФРОВАННЫЙ ЗАКРЫТЫЙ КЛЮЧ-----
-----КОНЕЦ ЗАШИФРОВАННЫЙ ЗАКРЫТЫЙ КЛЮЧ-----или кодировку Base64, см. раздел 4 [RFC4648], закодированного в DER PrivateKeyInfo, зажатого между:
-----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ-----
-----КОНЕЦ ЗАКРЫТОГО КЛЮЧА----
Немного более длинный ответ: «Между тегами в любом случае действует кодировка Base64, закодированная DER, закодированная ASN.1»
BEGIN SOMETHING
граница — это намек на то, что содержимое, вероятно, НЕЧТО, но оно не является обязывающим, а это означает, что читатель PEM не должен предполагать конкретное содержимое на основе граничного заголовка и должен просто использовать границу, чтобы узнать границы документа. - person Oleg Estekhin   schedule 14.07.2014