Шифрование RSA с C# на PHP

Мне нужно подключиться к определенному веб-сервису, который использует шифрование RSA. Используя NuSOAP и PHPseclib, я могу подключиться к серверу, чтобы получить открытый ключ, используемый для шифрования RSA, и отправить данные обратно на сервер.

Проблема возникает в том, как они шифруют данные, разработчик дал мне документацию и образец, написанный на C #, который трудно понять и преобразовать в PHP. Единственное, что нужно зашифровать, это пароль.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Dns.Lib.Compression;
    using Dns.Lib.Security.Cryptography;
    using ThirdPartyTest.ThirdPartyService;
    using SoapExtensionLib;

    private static string BaseServiceCall(int sysUserId, string password)
    {

            SecureMessageManager secureMessageManager = new SecureMessageManager();
            ThirdPartyService.Main client = new ThirdPartyService.Main();

            string dnPublicKey = client.GetPublicKey();//this is used to get the pbKey

            secureMessageManager.ImportThirdPartyRSAKey(dnPublicKey);

            string sessionId = Guid.NewGuid().ToString("N");

            string tokenRequestXml = @"<request>
<id>" + sysUserId + @"</id>
<password>" + secureMessageManager.RSAEncryptString(password) + @"</password>
<session>" + sessionId + @"</session>
<public>" + secureMessageManager.ExportPublicKey() + @"</public>
</request>";

            string tokenResonse = client.GetSommething(tokenRequestXml);
            //...
    }

И что делает secureMessageManager.ExportPublicKey()?

Вот моя версия PHP выше.

require_once('RSA-PHPseclib0.3.5/Crypt/RSA.php');
require_once('nusoap.php');
    $sysUserId  = '.....';
    $pass       = '.....';
    $sessionId  = session_id();
    $pubKey     = "<rsakeyvalue><modulus>kdT4UUBowCepvTU3panVLnAWqKSIik8eSc5Sog0e7BOP2EoNVwer5RfxIICaWzVpJtPAQJYQ9AaW4qpp3qIw3g3DR7OTw/lvif6y5VemiRue6u4T2eef4AG3Ka0MoMhTtMxIRXGNqx6hPyPn40F9ZMFwprFupFl0Z2LPRLR3Fek=</modulus><exponent>AQAB</exponent></rsakeyvalue>";//The Public key received from an other program

    $rsa        = new Crypt_RSA();
    $return     = $rsa->loadKey($pubKey);
    $password   = base64_encode($rsa->encrypt($pass));

    $inputData  = "<request><id>$sysUserId</id><password>$password</password><session>$sessionId</session><public>$pubKey</public></request>";
    $params     = array('inputData'=>$inputData);
    $result     = $client->call('GetSommething', $params, $namespaces, '', '',null,'document','literal');

Ошибка, которую я получаю от их сервера, - 'Server was unable to process request. ---> Error occurred while decoding OAEP padding.'. Я понял, что это как-то связано с тем, как я шифрую пароль. Проведя более 40 часов, ударяясь о кирпичную стену, не знаю, что делать.


person fredtma    schedule 28.11.2013    source источник
comment
Откуда мы должны знать, что делает SecureMessageManager? Откуда взялся этот класс?   -  person President James K. Polk    schedule 28.11.2013
comment
Я не писал код C#, это был пример, который мне дали для подражания (но я больше PHP-разработчик). Класс SecureMessageManager, вероятно, является классом, созданным из одной из включенных библиотек. Я надеюсь, что кто-то знает об этом и может разъяснить   -  person fredtma    schedule 29.11.2013
comment
Думаю, первое, что меня интересует, это... как выглядит содержимое $_SESSION['token']? Это формат, который поддерживает phpseclib? Вы можете проверить это, выполнив echo $rsa;   -  person neubert    schedule 29.11.2013
comment
формат для $_SESSION['токен'] <rsakeyvalue><modulus>kdT4UUBowCepvTU3panVLnAWqKSIik8eSc5Sog0e7BOP2EoNVwer5RfxIICaWzVpJtPAQJYQ9AaW4qpp3qIw3g3DR7OTw/lvif6y5VemiRue6u4T2eef4AG3Ka0MoMhTtMxIRXGNqx6hPyPn40F9ZMFwprFupFl0Z2LPRLR3Fek=</modulus><exponent>AQAB</exponent></rsakeyvalue> я сохранил его в сеансе, потому что он был сгенерирован с другой страницы   -  person fredtma    schedule 29.11.2013
comment
Я голосую за закрытие. Опуская самые важные детали, становится невозможно ответить на вопрос. Кроме того, если каким-то чудом появится другой разработчик, знакомый с SecureMessageManager, который ответит на ваш вопрос, это мало поможет озадаченным людям, которые будут обращаться сюда за помощью в будущем.   -  person President James K. Polk    schedule 29.11.2013
comment
$_SESSION['токен'] выглядит хорошо. Можете ли вы заставить SecureMessageManager зашифровать некоторый текст и опубликовать созданный им зашифрованный текст? Может быть, мы сможем выяснить формат, который он ожидает от этого.   -  person neubert    schedule 29.11.2013


Ответы (2)


Получил решение здесь и Здесь Необходимо внести некоторые изменения в библиотеку phpseclib по умолчанию, чтобы сделать ее совместимой для шифрования/дешифрования с библиотеками .net.
Я просто удивлен, что Что-то столь же очевидное, как несовместимость между тем, как PHP шифрует/дешифрует RSA, и тем, как это делает С#, несколько отличается, но об этом очень мало тем.

person fredtma    schedule 02.12.2013
comment
Правда, я также нахожу немного удивительным, что не так много информации об этом можно найти, и мне также потребовалось некоторое время, чтобы получить правильный работающий пример. Но я сделал, начиная с предоставленных вами ссылок, и для будущих посетителей, вот полный рабочий пример создания/обмена открытыми/закрытыми ключами с C# и PHP и отправки зашифрованных сообщений: csharp-tricks-en.blogspot.de/2015/04/rsa-with-c- и-php.html - person Oliver; 26.04.2015
comment
Но теперь я должен исправить себя, я понял, что phpseclib уже реализует форматы ключей XML - так что теперь это стало довольно просто: csharp-tricks-en.blogspot.de/2015/04/rsa-with-c-and-php_27.html (рекомендую это решение над моим предыдущим комментарием). - person Oliver; 27.04.2015

Вы должны проверить форум msdn, у них есть похожая тема. зашифровать с помощью php

На форуме asp.net заполнение OAEP

person Ecclesiate    schedule 29.11.2013
comment
Я протестировал их библиотеку, но, к сожалению, все еще получаю ошибку OAEP Padding. Разработчик попросил меня преобразовать текст в байт перед шифрованием данных, поэтому я пытаюсь это сделать. - person fredtma; 29.11.2013
comment
Байт в PHP? Я не думаю, что это необходимый шаг для шифрования с помощью RSA. - person Ecclesiate; 29.11.2013