我的Windows Mobile 6应用程序需要将数据发送到公司的php REST Web服务。 WS有一个返回公钥的方法,用于加密移动应用程序用户的用户名和密码。
他们给我一个用php编写的示例代码,它只是调用WS来获取公钥,然后使用,作为公钥参数,调用openssl_public_encrypt,即Web服务调用返回的值。这是摘录
function CallAPI($url, $data = false)
{
$curl = curl_init();
$url = sprintf("%s?%s", $url, http_build_query($data));
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
return curl_exec($curl);
}
$public_key=CallAPI(, "https://***.***.***/index.php/rest/getPKey");
$json = json_encode(array("username"=>"********","psw"=>"*******"));
openssl_public_encrypt($json, $encrypted, $public_key);
从Windows Mobile的角度来看似乎比这更复杂,我也不是真的进入RSA加密。
我做的第一件事是调用WS获取公钥,然后将其保存为字符串。以下是我用来加密数据的代码。
ASCIIEncoding ByteConverter = new ASCIIEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes(data_string);
byte[] public_key = ByteConverter.GetBytes(public_key_string);
byte[] encryptedData;
RSACryptoServiceProvider RSA_provider = new RSACryptoServiceProvider();
RSAParameters key_info = RSA_provider.ExportParameters(false);
key_info.Modulus = public_key;
RSA_provider.ImportParameters(key_info);
encryptedData = RSA_provider.Encrypt(dataToEncrypt, false);
string encrypted_string = ByteConverter.GetString(encryptedData, 0, encryptedData.Length);
return encrypted_string;
如果我尝试将数据发送到Web服务,由于身份验证失败而失败,我还注意到从PHP代码中加密的字符串始终是256个字符,而.NET加密的字符串具有完全不同的长度。 / p>
我做错了什么? 我在StackOverflow上看到了很多关于使用.NET和RSA加密的问题,但是Compact Framework中没有包含所使用的功能。
提前谢谢。
答案 0 :(得分:0)
我已经解决了使用BouncyCastle API在.NET端进行ecnryption / decryption并使用UrlEncode在Windows Mobile客户端和PHP服务器之间发送数据并替换UrlEncoded字符串中的所有' +'一个从客户端和服务器都知道的自定义字符串,我决定" ####"。