Я предполагаю, что под форматом XML вы подразумеваете XML DSig RSAKeyValue , а под форматом PEM вы подразумеваете, что OpenSSL экспортирует между -----BEGIN PUBLIC KEY-----
и -----END PUBLIC KEY-----
.
Сначала вам нужно извлечь модуль и открытый показатель из XML.
<RSAKeyValue>
<Modulus>xA7SEU+e0yQH5rm9kbCDN9o3aPIo7HbP7tX6WOocLZAtNfyxSZDU16ksL6W
jubafOqNEpcwR3RdFsT7bCqnXPBe5ELh5u4VEy19MzxkXRgrMvavzyBpVRgBUwUlV
5foK5hhmbktQhyNdy/6LpQRhDUDsTvK+g9Ucj47es9AQJ3U=
</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
Вы можете легко преобразовать их в битовую строку, используя base64_decode
.
Один разэто сделано, вам нужно как-то построить структуру ASN.1 открытого ключа.
Что экспортирует OpenSSL между BEGIN / END PUBLIC KEY, это структура X.509 SubjectPublicKeyInfo .
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
subjectPublicKey
изготовлен из последовательности, описанной в спецификации PKCS # 1 :
RSAPublicKey ::= SEQUENCE {
modulus INTEGER,
publicExponent INTEGER
}
algorithm
(AlgorithmIdentifier
) также описывается в спецификации PKCS # 1 (см. Раздел A.1):
rsaEncryption
OBJECT IDENTIFIER ::= { pkcs-1 1 }
Эта структура должна быть сериализована в виде DER, затем закодирована в base64 и затем помещена между BEGIN/ END delimiters.
Я не знаю ни одной библиотеки PHP, которая бы выполняла кодирование ASN.1 / DER, к сожалению (остальноеочень просто, но работа с ASN.1, как правило, утомительна).
Модуль PHP / PEAR Crypt_RSA может создавать открытые ключи RSA по модулю и показателю степени, но его метод toString()
используетпользовательский формат (только base64-кодировка результата PHP serialize
в структуре массива, который не имеет ничего общего с кодировкой ASN.1 / DER).