Спецификации для преобразования ключа в структуру приведены в спецификации PKCS # 1 . В основном это просто структура ASN.1:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
Затем она кодируется с использованием DER, отличительных правил кодирования для ASN.1. Это двоичная кодировка, которая, конечно, может быть преобразована в базу 64. Обычно, однако, она не просто преобразуется в базу 64, она также будет разбита на несколько строк и обернута строкой заголовка и строкой нижнего колонтитула, что дает вам PEM. В этом случае заголовок должен указывать RSA PUBLIC KEY
.
. Если вам нужна более высокая совместимость, двоичной структуре PKCS # 1, в свою очередь, предшествует описательная оболочка, используемая в сертификатах X.509 (которые используются в веб-браузерах, среди прочих). Эта структура называется SubjectPublicKeyInfo
, а оболочка PEM будет указывать тип PUBLIC KEY
- то есть без RSA. То, что это является ключом RSA publi c, уже указывается информацией в двоичной структуре.
Но я полагаю, что вы хотели бы начать с относительно простой структуры PKCS # 1 и затем подробно остановимся на этом. Для получения дополнительной информации попробуйте старый Руководство для неспециалистов по подмножеству ASN.1, BER и DER .
Мне нравятся стандарты, но вы также можете использовать двухбайтовый указатель длины для модуля и экспоненты c, а затем объединить их, как в:
<l_mod> <modulus> <l_exp> <pubexp>
Тогда вам все равно придется подумать о конкретном c способе кодирования целочисленных значений. Я бы использовал unsigned big endian, чтобы размер ключа ( в байтах вместо битов ) был значением l_mod
. Тогда вы можете base64 выше. Он нигде не стандартизирован, но его гораздо проще понять и запрограммировать.