Формат PKCS#1 и PKCS#8 для закрытого ключа RSA
Может ли кто-нибудь помочь мне понять, как ключ RSA буквально хранится в этих форматах? Я хотел бы знать разницу между форматами PKCS против кодировок (DER, PEM). Из того, что я понимаю, PEM более читабелен. PEM/DER для ключей / сертификатов похож на UTF-8/16 для символов? Какое значение DER/PEM? Извините, слишком много вопросов, но сыт по горло гуглом и получаю неопределенные ответы Благодарю.
2 ответа
PKCS#1 и PKCS#8 (стандарт криптографии с открытым ключом) - это просто стандарты, которые регулируют использование определенных криптографических примитивов, отступов и т. Д. Оба определяют форматы файлов, которые используются для хранения ключей, сертификатов и другой соответствующей информации.
PEM и DER немного интереснее. DER - это просто кодировка ASN.1 для ключей, сертификатов и т. Д., О которых вы сможете узнать в Google. Закрытые ключи и сертификаты кодируются с использованием DER и могут быть сохранены напрямую, как это. Однако эти файлы являются двоичными и не могут быть легко скопированы и вставлены, поэтому многие (если не большинство?) Реализации также принимают файлы в кодировке PEM. PEM в основном просто DER64 в кодировке. Мы добавляем заголовок, дополнительные метаданные и данные DER в кодировке base64, и у нас есть файл PEM.
(Расширение больше, чем я считаю, подходит для редактирования.)
PKCS1, доступный в нескольких версиях как rfcs 2313, 2437, 3447 и 8017, в основном использует алгоритм RSA для криптографии, включая шифрование, расшифровку, подпись и проверку. Но поскольку шифрование часто используется между системами или, по крайней мере, программами, удобно иметь определенный, совместимый формат для ключей, а PKCS1 определяет довольно минимальные форматы для открытых и закрытых ключей RSA в приложении A.1. Как подразумевал Люк, он использует ASN.1, традиционно кодируемый как DER, который является стандартом для функционально кодируемого кодирования данных практически любого вида.
PKCS8, доступный как rfc5208, с другой стороны, является стандартом для обработки закрытых ключей для всех алгоритмов, а не только для RSA. Он также использует ASN.1 DER и начинается с простого объединения AlgorithmIdentifier
структура ASN.1 (первая), определенная X.509, которая не очень удивительно идентифицирует алгоритм с OCTET STRING
который содержит представление ключа в зависимости от алгоритма. Для алгоритма RSA, идентифицируемого идентификатором AlgorithmIdentifier, содержащим OID, что означает rsaEncryption, строка OCTET содержит кодировку секретного ключа PKCS1.
PKCS8 также позволяет добавлять произвольные "атрибуты", но это редко используется.
(Например, невозможно преобразовать.jks в.pkcs12: избыточный закрытый ключ)
PKCS8 также предоставляет возможность шифрования закрытого ключа с использованием шифрования на основе пароля (на практике, хотя это явно не требуется). Это распространено, особенно когда PKCS8 используется как часть закрытого ключа PKCS12/PFX, хотя и не универсальная.
Поскольку сегодня большинство систем должны поддерживать несколько алгоритмов и хотят иметь возможность адаптироваться к новым алгоритмам по мере их разработки, PKCS8 предпочтительнее для приватных ключей, а аналогичная схема любого алгоритма определена в X.509 для публичных клавиш. Хотя PKCS12 / PFX часто предпочтительнее для обоих.
Ни один из них не имеет ничего общего с сертификатами или другими объектами PKI, такими как CSR, CRL, OCSP, SCT и т. Д. Они определены другими стандартами, включая некоторых других членов серии PKCS, хотя они могут использовать ключи, определенные этими стандарты.
Формат PEM, как сказал Люк, - это способ форматирования или (супер) кодирования (почти любых) двоичных данных / данных DER более удобным способом. Это происходит из попытки 1990-х годов защитить электронную почту с именем Privacy-Enhanced Mail, следовательно, PEM. В те дни системы электронной почты часто могли передавать или, по крайней мере, надежно передавать только печатный текст с ограниченным набором символов и часто только с ограниченной длиной строки, поэтому PEM кодировал двоичные данные как base64 с длиной строки 64. Сама схема PEM была не очень успешно и был заменен другими, такими как PGP и S/MIME, но формат, который он определил, все еще используется. В настоящее время системы электронной почты часто могут передавать двоичные данные, но, как сказал Люк, копирование и вставка часто могут обрабатывать только отображаемые символы, поэтому PEM все еще полезен и, кроме того, его легче распознавать людям.
Точнее, PEM кодирует некоторые данные, такие как, но не ограничиваясь этим, ключ PKCS1 или PKCS8 или сертификат, CSR и т. Д., Как:
строка, состоящая из 5 дефисов, слова BEGIN, одного или нескольких (разделенных пробелами) слов, определяющих тип данных, и 5 дефисов
необязательный (и редкий) заголовок в стиле rfc822, оканчивающийся пустой строкой
base64 данных, разбитых на строки по 64 символа (кроме последних); некоторые программы вместо этого используют (немного более новый) предел MIME в 76 символов
линия, подобная линии BEGIN, но с END вместо
Некоторые читатели проверяют / применяют длину строки и строку END, а некоторые нет, поэтому, если вы ошибаетесь, вы можете создавать файлы, которые иногда работают, а иногда нет, что раздражает отладку.
Так, например, закрытый ключ PKCS1 (незашифрованный) в PEM выглядит так:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCjcGqTkOq0CR3rTx0ZSQSIdTrDrFAYl29611xN8aVgMQIWtDB/
lD0W5TpKPuU9iaiG/sSn/VYt6EzN7Sr332jj7cyl2WrrHI6ujRswNy4HojMuqtfa
b5FFDpRmCuvl35fge18OvoQTJELhhJ1EvJ5KUeZiuJ3u3YyMnxxXzLuKbQIDAQAB
AoGAPrNDz7TKtaLBvaIuMaMXgBopHyQd3jFKbT/tg2Fu5kYm3PrnmCoQfZYXFKCo
ZUFIS/G1FBVWWGpD/MQ9tbYZkKpwuH+t2rGndMnLXiTC296/s9uix7gsjnT4Naci
5N6EN9pVUBwQmGrYUTHFc58ThtelSiPARX7LSU2ibtJSv8ECQQDWBRrrAYmbCUN7
ra0DFT6SppaDtvvuKtb+mUeKbg0B8U4y4wCIK5GH8EyQSwUWcXnNBO05rlUPbifs
DLv/u82lAkEAw39sTJ0KmJJyaChqvqAJ8guulKlgucQJ0Et9ppZyet9iVwNKX/aW
9UlwGBMQdafQ36nd1QMEA8AbAw4D+hw/KQJBANJbHDUGQtk2hrSmZNoV5HXB9Uiq
7v4N71k5ER8XwgM5yVGs2tX8dMM3RhnBEtQXXs9LW1uJZSOQcv7JGXNnhN0CQBZe
nzrJAWxh3XtznHtBfsHWelyCYRIAj4rpCHCmaGUM6IjCVKFUawOYKp5mmAyObkUZ
f8ue87emJLEdynC1CLkCQHduNjP1hemAGWrd6v8BHhE3kKtcK6KHsPvJR5dOfzbd
HAqVePERhISfN6cwZt5p8B3/JUwSR8el66DF7Jm57BM=
-----END RSA PRIVATE KEY-----
Тот же ключ в PKCS8 в незашифрованном виде:
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKNwapOQ6rQJHetP
HRlJBIh1OsOsUBiXb3rXXE3xpWAxAha0MH+UPRblOko+5T2JqIb+xKf9Vi3oTM3t
KvffaOPtzKXZauscjq6NGzA3LgeiMy6q19pvkUUOlGYK6+Xfl+B7Xw6+hBMkQuGE
nUS8nkpR5mK4ne7djIyfHFfMu4ptAgMBAAECgYA+s0PPtMq1osG9oi4xoxeAGikf
JB3eMUptP+2DYW7mRibc+ueYKhB9lhcUoKhlQUhL8bUUFVZYakP8xD21thmQqnC4
f63asad0ycteJMLb3r+z26LHuCyOdPg1pyLk3oQ32lVQHBCYathRMcVznxOG16VK
I8BFfstJTaJu0lK/wQJBANYFGusBiZsJQ3utrQMVPpKmloO2++4q1v6ZR4puDQHx
TjLjAIgrkYfwTJBLBRZxec0E7TmuVQ9uJ+wMu/+7zaUCQQDDf2xMnQqYknJoKGq+
oAnyC66UqWC5xAnQS32mlnJ632JXA0pf9pb1SXAYExB1p9Dfqd3VAwQDwBsDDgP6
HD8pAkEA0lscNQZC2TaGtKZk2hXkdcH1SKru/g3vWTkRHxfCAznJUaza1fx0wzdG
GcES1Bdez0tbW4llI5By/skZc2eE3QJAFl6fOskBbGHde3Oce0F+wdZ6XIJhEgCP
iukIcKZoZQzoiMJUoVRrA5gqnmaYDI5uRRl/y57zt6YksR3KcLUIuQJAd242M/WF
6YAZat3q/wEeETeQq1wrooew+8lHl05/Nt0cCpV48RGEhJ83pzBm3mnwHf8lTBJH
x6XroMXsmbnsEw==
-----END PRIVATE KEY-----
и PKCS8 зашифрованы:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIkErtXjGCalMCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBApOUG3MKrBC/5bDBH/s5VfBIIC
gN5o1aJxvJYbp2oA/quz+BnCFn8ts3wPPOcqarHddy0L/VH3BdqFNbnPZEaDnvDl
kqChRsti4AAeX18ItMeAyNLNFv0J4mfI8Q5E7iEnPp+dTsZqNfVIJe2NGxOS7zp2
oQQIZVgjW0akDehv6ZDN796qDBlMY2g80wbBrzVgMJu/byG9IQQjngUE9QNGwrsj
7lYSprxjfTZOk1aGBD0d/HsmetIJvCeJ2i/5xAiGgZRrSWMC6aN7Zlra3eIvHQTB
aKZ8/0IT3iKSr6FpkEopOQae8biiTEVGw9D339P3qOSs2ChWWF+OV2sEA67w6q5j
pz6Poc5jgq4FOcf06GdcVa4tst2uykNJCW0wHpcUR1Tr9ILLhrZPYBYVQWW53Eee
o4+mqW2YORdG3a/jLHpEjL0Vdg95QNpdZoMv8plotN1MUBLebd05aCe5hJUb/x74
3GTwmRGmKoHOhOO3hhUaMCmZIg1xPlNT3jqxrZDoATBeONbaFP8OOkeucVYHbdUO
Ad7z6J8XuZDoxM0BVrGykEiQL2nAOccdsGoC33C9hjkqgU8G9jWElbynJlVqv+1a
lFHWjX5lB6ueiY/rClpVlLmXGB83OVPlo70FV0B9rhRChyB1IJJRYPFDJHSHJNu+
Pqay8zw82Gh/G+TWH/JCLm5YjX55ZSFMUmvwOLaxyQpmAGNH6dIBTAaSctVA7UrV
jm7m+5T7seiNYNEi19vDJipgr0GbX8+np47VrsJDxsS20wTeA/9ltD0xXwNrEKHd
2Nv/1OaCgnBQHIGULgEn9pT3/vU87bBHYjVdrWoUmqd9zFYtdImQE9u8IKTxTe4R
UPRGHqltz4uOjbD1epkSGe0=
-----END ENCRYPTED PRIVATE KEY-----
Обратите внимание, что тип данных в каждом файле (или другом блоке данных) легко распознается по строкам BEGIN/END. Фактические значения ключей в данных нелегко считываются без инструментов, хотя только третьим действительно нужна секретная информация (пароль, используемый для шифрования).