RSA шифрует с помощью PHP и расшифровывает с помощью C#

Я пытаюсь зашифровать и расшифровать процесс между С# и PHP.

Мой код С#:

this.EncryptData("123456", 1024, this.PublicKey);

public byte[] Encrypt(byte[] byte_0, int keysize, string publicKey)
{
    byte[] numArray;    
    using (RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider(keysize))
    {
        rSACryptoServiceProvider.FromXmlString(publicKey);
        numArray = rSACryptoServiceProvider.Encrypt(byte_0, this.bool_0);
    }
    return numArray;
}

public string EncryptData(string string_0, int keysize, string publicKey)
{
    string base64String;
    try
    {
        byte[] numArray = this.Encrypt(Encoding.UTF8.GetBytes(string_0), keysize, publicKey);
        base64String = Convert.ToBase64String(numArray);
    }
    catch (Exception exception)
    {
        base64String = string.Empty;
    }
    return base64String;
}
public byte[] Decrypt(byte[] byte_0, int keysize, string Key)
{
    byte[] numArray;    
    using (RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider(keysize))
    {
        rSACryptoServiceProvider.FromXmlString(Key);
        numArray = rSACryptoServiceProvider.Decrypt(byte_0, this.bool_0);
    }
    return numArray;
}

public string DecryptData(string string_0, int keysize, string Key)
{
    string str;
    try
    {
        byte[] numArray = this.Decrypt(Convert.FromBase64String(string_0), keysize, Key);
        str = Encoding.UTF8.GetString(numArray);
    }
    catch (Exception exception)
    {
        str = string.Empty;
    }
    return str;
}

и мой PHP: lib(https://github.com/membersuite/sdk-php/blob/master/APISample/SSOWithSDK/phpseclib/Crypt/RSA_XML.php)

$rsa = new Crypt_RSA_XML();
$plaintext = '123456';
$rsa->loadKeyfromXML($publicKey);
$ciphertext = base64_encode(strrev($rsa->encrypt($plaintext)));

код после шифрования PHP не может расшифровать код С#. кто-нибудь может помочь?


person miniCat    schedule 18.03.2015    source источник
comment
Возможно случайное заполнение. Вы проверили, что можете расшифровать с любой стороны?   -  person Artjom B.    schedule 18.03.2015
comment
я обновляю код расшифровки   -  person miniCat    schedule 18.03.2015
comment
Что делает strrev во фрагменте кода PHP? Это кажется странным, потому что вы, кажется, не отменяете то, что он делает снова в С#, прежде чем расшифровывать его. (Я не использую PHP, поэтому сделал предположения о том, что он делает.)   -  person Evil Dog Pie    schedule 18.03.2015
comment
Как вы получаете ключ, который используете для шифрования? Является ли это обычным сертификатом подписи кода, если да, то как вы экспортируете открытый ключ и распространяете ли вы открытый ключ для расшифровки в С#?   -  person Kraang Prime    schedule 11.05.2015


Ответы (1)


Хотя корпорация Майкрософт использует для чисел прямой порядок байтов, RSA определяется PKCS#1/RFC 3447. Это явно определяет, как выполнять заполнение и тому подобное, но также определяет, как должна выглядеть результирующая строка октетов, используя I2OSP или примитив преобразования целого числа в строку октетов. Этот примитив задает выходные данные в виде массива байтов фиксированного размера (размера ключа) в формате с обратным порядком байтов. Это также кодировка, которую использует PHP, поэтому вам не следует инвертировать вывод.

Другими словами, вам не нужно использовать strrev.

person Maarten Bodewes    schedule 19.03.2015