"坏数据"CryptographicException

The*_*boy 9 c# encryption cryptography rsa

首先,我只是为了学术目的而编写了以下代码.我说这个的原因是因为我没有将它放在生产环境中,因此我"绕过"了我需要做的一些开销,我只需要能够使用加密/解密字符串下面的代码.我能够做到这一点,但由于某种原因,我开始收到"CryptographicException Bad Data",我不确定是什么原因导致了这个问题.

   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);

        }
    }
Run Code Online (Sandbox Code Playgroud)

它只是在RSADecrypt调用上抛出此异常.

有任何想法吗?我读到了可能与传递给RSA.Decrypt的encryptedData的预期大小有关的地方.

谢谢 }

Ras*_*ber 17

  • 使用字符串编码(即Encoding.Unicode)来回转换明文.

  • 使用Base-64(即Convert.[To/From]Base64String)来回转换加密数据;

像这样:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


mat*_*ewk 6

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

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

人们在使用托管加密类时犯的一个常见错误是,他们尝试使用其中一个编码类将加密操作的结果存储在字符串中.那似乎有道理吗?毕竟,Encoding.ToString()接受一个byte []并将其转换为一个正是他们所寻找的字符串.

...

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

...

每次都有效的代码结果,因为保证base 64编码能够准确地表示任何输入字节序列.

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