在Windows Mobile 6上使用RSACryptoServiceProvider和公钥字符串进行加密

时间:2014-08-03 19:10:28

标签: c# windows-mobile rsa public-key-encryption windows-mobile-6.5

我的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中没有包含所使用的功能。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了使用BouncyCastle API在.NET端进行ecnryption / decryption并使用UrlEncode在Windows Mobile客户端和PHP服务器之间发送数据并替换UrlEncoded字符串中的所有' +'一个从客户端和服务器都知道的自定义字符串,我决定" ####"。