![](/img/trans.png)
[英]RSACryptoServiceProvider encrypt and decrypt using own public and private key
[英]Encrypt with RSACryptoServiceProvider and public key string on Windows Mobile 6
我的Windows Mobile 6應用程序需要將數據發送到公司的php REST Web服務。 WS具有一種返回公鑰的方法,該方法用於加密移動應用程序用戶的用戶名和密碼。
他們給了我一個用php編寫的示例代碼,該示例代碼簡單地調用WS來獲取公鑰,然后調用opensl_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加密字符串的長度完全不同。
我做錯了什么? 我在StackOverflow上看到了很多有關使用.NET和RSA加密的問題,但是所使用的功能未包含在Compact Framework中。
先感謝您。
我已經解決了使用BouncyCastle API在.NET端進行加密/解密,並使用UrlEncode在Windows Mobile客戶端和PHP服務器之間發送數據,並將UrlEncoded字符串中的所有“ +”替換為客戶端和服務器都知道的自定義字符串的問題,我決定選擇“ ####”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.