RSA加密从C#到PHP
我需要连接到使用RSA加密的特定Web服务。使用NuSOAP和PHPseclib,我可以连接到服务器以获取用于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
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');