我在使用RSA加密和解密C#时遇到了问题。我已经开发了一个web服务,将发送敏感的财务信息和交易。我希望能够做的是在客户端,使用客户端RSA私钥加密某些字段,一旦它到达我的服务,它将与客户端公钥解密。
目前,我一直得到一个“要解密的数据超过了这个128字节模数的最大值”。异常。我没有处理太多的RSA密码学,所以任何帮助都将不胜感激。
这是我用来生成密钥的方法
private void buttonGenerate_Click(object sender, EventArgs e)
{
string secretKey = RandomString(12, true);
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
SecureString secureString = new SecureString();
byte[] stringBytes = Encoding.ASCII.GetBytes(secretKey);
for (int i = 0; i < stringBytes.Length; i++)
{
secureString.AppendChar((char)stringBytes[i]);
}
secureString.MakeReadOnly();
param.KeyPassword = secureString;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
rsaProvider = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
rsaProvider.KeySize = 1024;
string publicKey = rsaProvider.ToXmlString(false);
string privateKey = rsaProvider.ToXmlString(true);
Repository.RSA_XML_PRIVATE_KEY = privateKey;
Repository.RSA_XML_PUBLIC_KEY = publicKey;
textBoxRsaPrivate.Text = Repository.RSA_XML_PRIVATE_KEY;
textBoxRsaPublic.Text = Repository.RSA_XML_PUBLIC_KEY;
MessageBox.Show("Please note, when generating keys you must sign on to the gateway\n" +
" to exhange keys otherwise transactions will fail", "Key Exchange", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
生成密钥后,我将公钥发送到web服务,后者将其存储为XML文件。
现在我决定测试一下,下面是我的加密字符串的方法
public static string RsaEncrypt(string dataToEncrypt)
{
string rsaPrivate = RSA_XML_PRIVATE_KEY;
CspParameters csp = new CspParameters();
csp.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(csp);
provider.FromXmlString(rsaPrivate);
ASCIIEncoding enc = new ASCIIEncoding();
int numOfChars = enc.GetByteCount(dataToEncrypt);
byte[] tempArray = enc.GetBytes(dataToEncrypt);
byte[] result = provider.Encrypt(tempArray, true);
string resultString = Convert.ToBase64String(result);
Console.WriteLine("Encrypted : " + resultString);
return resultString;
}
我确实得到了一个似乎是加密值的东西。在我创建的测试crypto web方法中,我获取这些加密的数据,尝试使用客户端公钥解密数据,然后以明文形式将其发送回来。但这就是抛出异常的地方。下面是我的方法。
public string DecryptRSA(string data, string merchantId)
{
string clearData = null;
try
{
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
string merchantRsaPublic = GetXmlRsaKey(merchantId);
rsaProvider.FromXmlString(merchantRsaPublic);
byte[] asciiString = Encoding.ASCII.GetBytes(data);
byte[] decryptedData = rsaProvider.Decrypt(asciiString, false);
clearData = Convert.ToString(decryptedData);
}
catch (CryptographicException ex)
{
Log.Error("A cryptographic error occured trying to decrypt a value for " + merchantId, ex);
}
return clearData;
}
如果有人能帮助我,那就太棒了,正如我所说的,我在C# RSA加密/解密方面并没有做太多的工作。
发布于 2010-03-19 16:47:29
在DecryptRSA中,“数据”是64位编码的吗?如果是,则必须先撤消该操作。
老实说,我认为你不应该自己实现这个例程来保护“敏感的金融信息”,除非你有很多密码学的经验。犯错误的方法太多了。最好使用一些现成的解决方案-也许SSL和证书,或者仅仅是PGP或GnuPG?
https://stackoverflow.com/questions/2475861
复制相似问题