最近,研究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了!