Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RSA加密从C#到PHP_C#_Php_Encryption_Rsa_Phpseclib - Fatal编程技术网

RSA加密从C#到PHP

RSA加密从C#到PHP,c#,php,encryption,rsa,phpseclib,C#,Php,Encryption,Rsa,Phpseclib,我需要连接到使用RSA加密的特定Web服务。使用NuSOAP和PHPseclib,我可以连接到服务器以获取用于RSA加密的公钥,并将数据发送回服务器 他们加密数据的方式出现了问题,那里的开发人员给了我用C#编写的文档和示例,很难理解并转换为PHP。 唯一需要加密的是密码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Dn

我需要连接到使用RSA加密的特定Web服务。使用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);
            //...
    }

我从他们服务器收到的错误是服务器无法处理请求。-->解码OAEP填充时出错。“。我推测这与我加密密码的方式有关。花了40多个小时撞上了一堵砖墙,不知道该怎么办。

你应该去msdn论坛看看,他们也有类似的话题。

论asp.net论坛

得到解决方案并 需要对默认phpseclib库进行一些更改,以使其与.net库的加密/解密兼容。

我只是感到惊讶的是,PHP加密/解密RSA的方式与C#加密/解密RSA的方式之间存在着明显的不兼容,这两种方式在某种程度上有所不同,但在这方面的主题却很少。

我们怎么知道SecureMessageManager做了什么?这个类是从哪里来的?我没有编写C#代码,这是一个让我遵循的示例(但我更喜欢PHP开发人员)。
SecureMessageManager
类可能是从包含的库之一创建的类。我希望有人知道这件事,并能澄清我想我好奇的第一件事是。。。$\u会话['token']的内容是什么样子的?它是phpseclib支持的格式吗?您可以通过执行
echo$rsa$_会话['token']的格式是
kdt4uubowceptu3panvlnawqksiik8esc5sog0e7op2eonvwer5rfxiicawzvpjtpaqjjyq9aaw4qpp3qiw3d7otw/lvif6y5vemirue6u42ef4ag3ka0mhttmxirxgnqx6hpypn40f9fzmfprfupfl0z2lprlr3fek=AQAB
我将其保存在一个会话中,因为它是从其他页面生成的。由于忽略了最重要的细节,这就成了一个无法回答的问题。此外,如果奇迹发生,另一位熟悉SecureMessageManager的开发人员似乎回答了您的问题,这对未来前来寻求帮助的困惑的人们几乎没有帮助。我已经测试了他们的库,但不幸的是,我仍然得到了
OAEP填充
错误。开发人员确实要求我在加密数据之前将文本转换为字节,所以我尝试在PHP中使用该字节?我不认为这是使用RSA加密的必要步骤。的确,我还发现,关于这方面的信息不多,这有点令人惊讶,而且我还需要一些时间来获得一个正确的示例。但我做到了,从您提供的链接开始,对于未来的访问者,这里有一个完整的工作示例,使用C#和PHP创建/释放公钥/私钥,并发送加密消息:但现在我必须纠正自己,我认为phpseclib已经实现了XML密钥格式,所以现在它变得非常简单:(与我之前的评论相比,我推荐此解决方案)。
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');