【发布时间】:2011-01-29 08:54:59
【问题描述】:
我在使用 RSA 进行 C# 加密和解密时遇到问题。我开发了一个 Web 服务,它将发送敏感的财务信息和交易。我想做的是在客户端,使用客户端 RSA 私钥加密某些字段,一旦它到达我的服务,它将使用客户端公钥解密。
目前我不断收到“要解密的数据超过此 128 字节模数的最大值”。例外。我对 C# 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);
}
生成密钥后,我将公钥发送到将其存储为 XML 文件的 Web 服务。
现在我决定测试一下,所以这是我加密字符串的方法
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;
}
我确实得到了似乎是加密的值。在我创建的测试加密 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 加密/解密方面做得不多。
【问题讨论】:
-
最近 RSA 加密被破解的事情对你有影响吗? engadget.com/2010/03/09/…
-
RSA 未破解。在实际系统中,只有它的实现会受到侧信道攻击:该实现可能会通过功耗、时序和其他不属于抽象的物理措施泄露私钥信息电脑的型号。这已经有很长一段时间了(我认为在 1997 年描述了定时攻击)。这样的新闻不是新闻,也不是真正的“裂缝”。
标签: c# rsa encryption