Преобразовать ключ pem rsa в xml для C # RSACryptoServiceProvider.FromXmlString

Я генерирую открытый и закрытый ключи RSA с помощью PHP:

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?

3

Решение

С помощью 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 использует формат ключа XML, аналогичный один из XKMS 2.0 просто с другим элементом документа.

Расширение openssl в PHP не предлагает функции для его непосредственного создания, однако с помощью openssl_pkey_get_details() функция Вы можете получить все детали ключа RSA, который вам нужен для создания файла XML. Тогда это довольно просто:

$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.

Материалы по теме:

2

По вопросам рекламы [email protected]