У меня есть код C # шифрования, который я пытаюсь реализовать в PHP и phpseclib и получить точно такие же результаты. Это RSA. Но я не могу сделать это. Это дает мне пустую строку в PHP в кодированном виде.
Открытый ключ в следующем формате:
<?xml version="1.0" encoding="utf-16"?>
<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Exponent>AQAB</Exponent>
<Modulus>sMFsHSyxAP5N85yvx/XDs9acJa30qwBjoOdDKvNOHJUYBpspwatkdtErCqM2W6tXH9rbvhIn8/nqW4OqAdLinlgkEJoQ/qnzKjYJhHl4YzKFL6Wp+iFRH6ar6ZWOE87LeNQ0nHwlXKoWkJQKV8NB38XRw6aLvNTj8Po2yaFDbQFztsJ+ILkumRh7Leu77IV+124Swc6JqLRt5z2FnDX869dRi2fqcnFa1EHEBsPEndVd2HSeJUncTQiWJ9SNRU+WLltVVewYiGheqr1ABab++3XM5qrB6fWn/RN9Fcg5nM8fachAFSX2YRrEsg7mcbNALRes6OEdpI0LBdX8Wdw6oQ==</Modulus>
</RSAParameters>
Код C #:
public static string Encrypt(string data, string public)
{
RSAParameters pubKey = public;
var csp = new RSACryptoServiceProvider();
csp.ImportParameters(pubKey);
var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(data);
var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);
return Convert.ToBase64String(bytesCypherText);
}
В PHP я делаю это, но в результате получается пустая строка:
$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger(($modulus), 16);
$exponent = new Math_BigInteger(($exponent), 16);
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
$rsa->setPublicKey(array('n' => $modulus, 'e' => $exponent));
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$encryptedPassword = $rsa->encrypt($password);
echo $encryptedPassword;
phpseclib имеет встроенную поддержку ключей этого формата в течение многих лет. Поскольку v0.2.2, которая, согласно https://github.com/phpseclib/phpseclib/releases/tag/0.2.2, был выпущен чуть менее пяти лет назад.
Во всяком случае, это сработало для меня:
<?php
include('Crypt/RSA.php');
$xml = '<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Exponent>AQAB</Exponent>
<Modulus>sMFsHSyxAP5N85yvx/XDs9acJa30qwBjoOdDKvNOHJUYBpspwatkdtErCqM2W6tXH9rbvhIn8/nqW4OqAdLinlgkEJoQ/qnzKjYJhHl4YzKFL6Wp+iFRH6ar6ZWOE87LeNQ0nHwlXKoWkJQKV8NB38XRw6aLvNTj8Po2yaFDbQFztsJ+ILkumRh7Leu77IV+124Swc6JqLRt5z2FnDX869dRi2fqcnFa1EHEBsPEndVd2HSeJUncTQiWJ9SNRU+WLltVVewYiGheqr1ABab++3XM5qrB6fWn/RN9Fcg5nM8fachAFSX2YRrEsg7mcbNALRes6OEdpI0LBdX8Wdw6oQ==</Modulus>
</RSAParameters>';
$rsa = new Crypt_RSA();
$rsa->loadKey($xml);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$encryptedPassword = $rsa->encrypt('password');
echo base64_encode($encryptedPassword);
Я должен был удалить <?xml version="1.0" encoding="utf-16"?>
немного от ключа, но кроме этого это работало.
Других решений пока нет …