如何将 RSA 公钥从 XML 转换为 PEM (PHP)?
最佳答案
我假设 XML 格式是指 XML DSig RSAKeyValue ,而 PEM 格式是指 OpenSSL 在 -----BEGIN PUBLIC KEY-----
和 -----END PUBLIC KEY----- 之间导出的内容
。
您首先需要从 XML 中提取模数和公共(public)指数。
<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 structure .
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
subjectPublicKey
由 PKCS#1 spec 中描述的序列组成:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER,
publicExponent INTEGER
}
算法
(AlgorithmIdentifier
)也在 PKCS#1 规范(参见 A.1 节)中进行了描述:
rsaEncryption
OBJECT IDENTIFIER ::= { pkcs-1 1 }
此结构需要以 DER 形式序列化,然后进行 base64 编码,然后放在 BEGIN/END 分隔符之间。
不幸的是,我不知道有任何 PHP 库可以执行 ASN.1/DER 编码(其余部分相对容易,但处理 ASN.1 往往很乏味)。
PHP/PEAR Crypt_RSA module可以从模数和指数构造 RSA 公钥,但它的 toString()
方法使用自定义格式(只是数组结构上 PHP serialize
结果的 base64 编码,与ASN.1/DER编码无关)。
关于php - 将 RSA 公钥从 XML 转换为 PEM (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568012/