【问题标题】:Convert pem rsa key to xml for C# RSACryptoServiceProvider.FromXmlString将 PEM RSA 密钥转换为 C# RSACryptoServiceProvider.FromXmlString 的 xml
【发布时间】:2014-12-20 12:04:57
【问题描述】:

我用 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?

【问题讨论】:

  • 您能解释一下在您的问题中使用strcmp 的原因是什么吗?当我运行你的代码时,$pkGeneratePrivate$pkGeneratePublic 是相同的。

标签: c# php xml rsa


【解决方案1】:

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

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...');

echo $rsa->getPrivateKey(CRYPT_RSA_PRIVATE_FORMAT_XML);

【讨论】:

    【解决方案2】:

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

    RSACryptoServiceProvider.FromXmlString 中的

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

    PHP 中的 openssl 扩展不提供直接创建它的函数,但是在openssl_pkey_get_details() function 的帮助下,您可以获得创建 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 变量中拥有资源并将其“存储”到标准输出(用于演示目的)。您也可以将其存储到文件中:

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

    或将其赋值给一个变量:

    $xmlString = $xml->asXML();
    

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

    相关资料:

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2011-04-03
      • 2014-02-06
      • 2015-01-21
      • 1970-01-01
      相关资源
      最近更新 更多