最近,研究RSA加密解密時,出現一個Bug。
是這樣的,在遠程測試接口時,需要進行RSA數據解密。
RSA解密代碼如下:
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">經過Base64編碼的密文</param>
/// <param name="privateKey">私鑰</param>
/// <returns>RSA解密後的數據</returns>
public static string decrypt(string encryptData, string privateKey)
{
string decryptData = "";
try
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKey);
byte[] bEncrypt = Convert.FromBase64String(encryptData);
int length = bEncrypt.Length;
int offset = 0;
string cache ;
int i = 0;
while (length - offset > 0)
{
if (length - offset > MAXDECRYPTSIZE)
{
cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, MAXDECRYPTSIZE), false));
}
else
{
cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, length - offset), false));
}
decryptData += cache;
i++;
offset = i*MAXDECRYPTSIZE;
}
}
catch(Exception e)
{
throw e;
}
return decryptData;
}
在進行本地調試或者是發佈到本地IIS上,加密解密一切正常,但是,一把服務發佈到遠程服務器上時,在進行解密,卻提示如下錯誤:
System.Security.Cryptography.CryptographicException:系統找不到指定的文件。
在 Util.Security.RSAUtils.decrypt(String encryptData,String privateKey) 位置 D:\documents\visual studio2010\Projects\MSPJK\MSPJK\RSAUtils.cs:行號 175
在MSPJK.DAO.DAO.login(loginInfo loginInfo) 位置 D:\documents\visualstudio 2010\Projects\MSPJK\MSPJK\DAO.cs:行號 2052
在找了許多資料後算是解決了。解決辦法如下:
將代碼中:
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
改爲:
CspParameters RSAParams = new CspParameters();
RSAParams.Flags = CspProviderFlags.UseMachineKeyStore;
System.Security.Cryptography.RSACryptoServiceProvider provider = new RSACryptoServiceProvider(1024, RSAParams);
再進行測試,OK了!