2013-11-28 1 views
0

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

Проблема возникает в том, как они шифруют данные, разработчик там дал мне документацию и образец, написанные на 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 часов удара кирпичной стены, не уверен, что делать.

+1

Как мы должны знать, что делает SecureMessageManager? Откуда появился этот класс? –

+0

Я не писал код C#, это был пример, который мне дал (но я больше PHP-разработчик). Класс 'SecureMessageManager', вероятно, является классом, созданным из одной из включенной библиотеки. Я скачу, что кто-то знает об этом и может уточнить – fredtma

+0

Я думаю, первое, что мне интересно, - это то, как выглядит содержимое $ _SESSION ['token']? Поддерживается ли формат phpseclib? Вы можете проверить это, выполнив 'эхо $ ПДС;' – neubert

ответ

0

Получили решение here и Here Есть некоторые изменения, которые должны быть сделаны в библиотеке по phpseclib умолчанию, чтобы сделать его совместимым для шифрования/дешифрования с .net библиотеки.
Я просто удивлен, что что-то столь же очевидное, как несовместимость между тем, как PHP шифрует/расшифровывает RSA и как C# делает это как-то иначе, но очень немного темы на нем.

+0

Правда, я также немного удивляюсь, что не так много информации об этом можно найти, и мне также нужно некоторое время, чтобы получить правильный пример работы.Но я сделал это, начиная с ваших предоставленных ссылок и для будущих посетителей, вот полный рабочий пример создания/обмена общедоступных/закрытых ключей с C# и PHP и отправки зашифрованных сообщений: http: //csharp-tricks-en.blogspot. de/2015/04/rsa-with-c-and-php.html – Oliver

+0

Но теперь я должен исправить себя, я подумал, что phpseclib уже реализует форматы ключевых слов XML - так что теперь он стал довольно простым: http: // csharp- tricks-en.blogspot.de/2015/04/rsa-with-c-and-php_27.html (я рекомендую это решение по сравнению с моим предыдущим комментарием). – Oliver

-1

Вы должны проверить форум msdn, у них похожая тема. encrypt with php

На форуме asp.net OAEP padding

+0

Я протестировал их библиотеку, но, к сожалению, я все еще получаю ошибку «OAEP Padding». Разработчик попросил меня преобразовать текст в Byte перед тем, как шифровать данные, поэтому я пытаюсь сделать это – fredtma

+0

Byte в PHP? Я не думаю, что это необходимый шаг для шифрования с помощью RSA. – Ecclesiate

 Смежные вопросы

  • Нет связанных вопросов^_^