首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET中的RSA加密/解密问题

.NET中的RSA加密/解密问题
EN

Stack Overflow用户
提问于 2010-03-19 16:28:12
回答 1查看 38.5K关注 0票数 18

我在使用RSA加密和解密C#时遇到了问题。我已经开发了一个web服务,将发送敏感的财务信息和交易。我希望能够做的是在客户端,使用客户端RSA私钥加密某些字段,一旦它到达我的服务,它将与客户端公钥解密。

目前,我一直得到一个“要解密的数据超过了这个128字节模数的最大值”。异常。我没有处理太多的RSA密码学,所以任何帮助都将不胜感激。

这是我用来生成密钥的方法

代码语言:javascript
复制
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文件。

现在我决定测试一下,下面是我的加密字符串的方法

代码语言:javascript
复制
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方法中,我获取这些加密的数据,尝试使用客户端公钥解密数据,然后以明文形式将其发送回来。但这就是抛出异常的地方。下面是我的方法。

代码语言:javascript
复制
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加密/解密方面并没有做太多的工作。

EN

回答 1

Stack Overflow用户

发布于 2010-03-19 16:47:29

在DecryptRSA中,“数据”是64位编码的吗?如果是,则必须先撤消该操作。

老实说,我认为你不应该自己实现这个例程来保护“敏感的金融信息”,除非你有很多密码学的经验。犯错误的方法太多了。最好使用一些现成的解决方案-也许SSL和证书,或者仅仅是PGP或GnuPG?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2475861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档