将 pem rsa key 转换为 xml for C# RSACryptoServiceProvider.FromXm


Convert pem rsa key to xml for C# RSACryptoServiceProvider.FromXmlString

我用PHP生成RSA公钥和私钥:

function genKeys($pkey, $skey)
{
    $pkGenerate = openssl_pkey_new(array(
        'private_key_bits' => 2048,
        'private_key_type' => OPENSSL_KEYTYPE_RSA
    ));
    $pkGeneratePrivate = null;
    openssl_pkey_export($pkGenerate, $pkGeneratePrivate);
    $pkGenerateDetails = openssl_pkey_get_details($pkGenerate);
    $pkGeneratePublic  = $pkGenerateDetails['key'];
    openssl_pkey_free($pkGenerate);
    $pkImport        = openssl_pkey_get_private($pkGeneratePrivate);
    $pkImportDetails = openssl_pkey_get_details($pkImport);
    $pkImportPublic  = $pkImportDetails['key'];
    openssl_pkey_free($pkImport);
    $result = (bool) strcmp($pkGeneratePublic, $pkImportPublic);
    if ($result) {
        file_put_contents($pkey, $pkGeneratePrivate);
        file_put_contents($skey, $pkGeneratePublic);
    }
    return $result;
}

我需要将PEM文件与RSACryptoServiceProvider一起使用。

那么,如何将PEM公共和私有转换为XML?

使用 http://phpseclib.sourceforge.net/:

<?php
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->loadKey('...');
echo $rsa->getPrivateKey(CRYPT_RSA_PRIVATE_FORMAT_XML);

这个答案有点晚了,我很难理解你到底在寻找什么,现在可以破译它了。

RSACryptoServiceProvider.FromXmlString 中的 .Net 使用类似于 XKMS 2.0 中的 XML 密钥格式,只是文档元素不同。

PHP 中的 openssl 扩展不提供直接创建它的函数,但是借助openssl_pkey_get_details()函数,您可以获得创建 XML 文件所需的 RSA 密钥的所有详细信息。然后就很简单了:

$rsa = openssl_pkey_get_details($pkGenerate)['rsa'];
$xml = new SimpleXMLElement("<RSAKeyValue/>"); // Use <RSAKeyPair/> for XKMS 2.0
// .Net / XKMS openssl RSA indecies to XML element names mappings
$map = ["n"    => "Modulus", "e"    => "Exponent", "p"    => "P",        "q"    => "Q",
        "dmp1" => "DP",      "dmq1" => "DQ",       "iqmp" => "InverseQ", "d"    => "D",];
foreach ($map as $key => $element) {
    $xml->addChild($element, base64_encode($rsa[$key]));
}
$xml->asXML('php://output');

此示例在密钥生成后继续,您在 $pkGenerate 变量中拥有资源并将其"存储"到 stdout(用于演示目的(。您也可以将其存储到文件中:

$xml->asXML('/path/to/file');

或将其断言为变量:

$xmlString = $xml->asXML();

因此,从技术上讲,如果您使用的是openssl扩展,则不需要添加完整的phpseclib来创建XML。

相关资料:

  • RSA Key ( XML 格式 ( 兼容 .Net (Java(
  • 密钥文件编码 - RSA 密钥格式
  • 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?