php - 将 RSA 公钥从 XML 转换为 PEM (PHP)

标签 php xml rsa public-key pem

如何将 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 }

subjectPublicKeyPKCS#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/

相关文章:

java - 使用 XSL 进行 XML 转换

c# - 包含来自 xml 的事件的动态按钮列表

java - 转换/验证的首选方式 - XSLT/XSD

java - 验证 XML 签名 JAVA

php - 在 Yii 中使用资源的正确方法是什么?

php - WordPress 迁移后 category-slug.php 不工作

javascript - 如何在 JavaScript 中管理 PHP 代码中的空值

php - 如何减少我的 redis 的延迟?

java - 解密错误填充错误

c# - 将 openssl 创建的自签名证书导入 X509Certificate2 (Mono) : Can encrypt, 无法解密