首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Bad Data“CryptographicException

"Bad Data“CryptographicException
EN

Stack Overflow用户
提问于 2012-03-12 07:17:54
回答 4查看 30.3K关注 0票数 9

首先,我写下面的代码只是出于学术目的。我这么说的原因是因为我没有把它放在生产环境中,因此我“绕过”了一些我需要做的开销,如果我是这样的话,我只需要能够使用下面的代码加密/解密一个字符串。我有几次能够做到这一点,但由于某种原因,我开始收到"CryptographicException错误数据“,并且不确定是什么导致了这个问题。

代码语言:javascript
复制
   private string RSAEncrypt(string value)
    {
        byte[] encryptedData = Encoding.Unicode.GetBytes(value);

        CspParameters cspParams = new CspParameters();
        cspParams.KeyContainerName = _rsaContainerName;
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
        {
            encryptedData = RSA.Encrypt(encryptedData, false);
            return Convert.ToBase64String(encryptedData);

        }

    }



    private string RSADecrypt(string value)
    {

        byte[] encryptedData = Encoding.Unicode.GetBytes(value);

        CspParameters cspParams = new CspParameters();
        cspParams.KeyContainerName = _rsaContainerName;
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
        { 
            encryptedData = RSA.Decrypt(encryptedData,false);
            return Convert.ToBase64String(encryptedData);

        }
    }

它只是在RSADecrypt调用中抛出了这个异常。

有什么想法吗?我在某处读到,它可能与传递给RSA.Decrypt的encryptedData的预期大小有关。

谢谢}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-12 16:14:24

  • 使用字符串编码来回转换明文(即,使用Base-64 (即,Convert.[To/From]Base64String);

)来回转换加密数据

如下所示:

代码语言:javascript
复制
private string RSAEncrypt(string value)
{
    byte[] plaintext = Encoding.Unicode.GetBytes(value);

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = _rsaContainerName;
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
    {
        byte[] encryptedData = RSA.Encrypt(plaintext, false);
        return Convert.ToBase64String(encryptedData);
    }
}

private string RSADecrypt(string value)
{
    byte[] encryptedData = Convert.FromBase64String(value);

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = _rsaContainerName;
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
    { 
        byte[] decryptedData = RSA.Decrypt(encryptedData,false);
        return Encoding.Unicode.GetString(decryptedData);
    }
}
票数 17
EN

Stack Overflow用户

发布于 2012-03-12 07:23:22

http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx

不通过字符串编码往返密文

人们在使用托管加密类时经常犯的一个错误是,他们试图通过使用某个Encoding类将加密操作的结果存储在字符串中。这似乎是有道理的,对吧?毕竟,Encoding.ToString()接受一个byte[]并将其转换为一个字符串,而这正是他们想要的。

..。

相反,如果要将密文转换为字符串,请使用Base64编码。

..。

导致每次都能工作的代码,因为可以保证base64编码能够准确地表示任何输入字节序列。

这里有一个很好的、正确的示例:http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx

票数 6
EN

Stack Overflow用户

发布于 2012-03-12 21:48:14

RSA不用于加密大型对象。当你超过填充限制时,你会得到异常。实际的限制是基于填充本身(使用false意味着您使用的是旧的 PKCS#1 v1.5填充)和公钥的长度(2048位)。

RSA与大对象一起使用的正确方法是使用对称密钥(例如256位AES密钥)加密大对象,并使用您的RSA公钥加密此密钥。

你可以在我的blog上找到做这些事情的代码。

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

https://stackoverflow.com/questions/9659898

复制
相关文章

相似问题

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