将 PEM RSA 密钥转换为 C# RSACryptoServiceProvider.FromXmlString 的 xml
Posted
技术标签:
【中文标题】将 PEM RSA 密钥转换为 C# RSACryptoServiceProvider.FromXmlString 的 xml【英文标题】:Convert pem rsa key to xml for C# RSACryptoServiceProvider.FromXmlString 【发布时间】: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
是相同的。
【参考方案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。
相关资料:
RSA Key ( XML Format ) compatible for .Net (Java) Key File Encoding - RSA Key Formats What is a Pem file and how does it differ from other OpenSSL Generated Key File Formats?【讨论】:
以上是关于将 PEM RSA 密钥转换为 C# RSACryptoServiceProvider.FromXmlString 的 xml的主要内容,如果未能解决你的问题,请参考以下文章