c#Rsa Decryption抛出“Bad Data”异常

时间:2016-08-15 13:01:25

标签: c# encryption cryptography rsa

我正在使用microsoft的RSACryptoServiceProvider类来加密/解密数据。 但是,解密函数会抛出异常“Bad Data”。 是否每次使用加密/解密时都要创建提供者类的新实例?

RSA提供商类

 static public byte[] RSAEncrypt(byte[] byteEncrypt, RSAParameters RSAInfo, bool isOAEP)
    {
        try
        {
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                RSA.ImportParameters(RSAInfo);

                //Encrypt the passed byte array and specify OAEP padding.
                return RSA.Encrypt(byteEncrypt, isOAEP);
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }

    static public byte[] RSADecrypt(byte[] byteDecrypt, RSAParameters RSAInfo, bool isOAEP)
    {
        try
        {
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096))
            {
                //Import the RSA Key information. This needs
                //to include the private key information.
                RSA.ImportParameters(RSAInfo);

                //Decrypt the passed byte array and specify OAEP padding.
                return RSA.Decrypt(byteDecrypt, isOAEP);
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.ToString());
            return null;
        }
    }
}

用法

  UnicodeEncoding ByteConverter = new UnicodeEncoding();
  RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
  byte[] plainPassword;
  byte[] encryptedPassword;

  plainPassword = ByteConverter.GetBytes(connectionStringPasswordTextBox.Text);
  encryptedPassword = CryptoHelper.RSAEncrypt(plainPassword, RSA.ExportParameters(false), false);
  RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
  byte[] decryptedPassword = CryptoHelper.RSADecrypt(Convert.FromBase64String(connectionString.password), RSA.ExportParameters(true), false);

修改

在再试一次之后,异常已更改为“参数不正确”。我认为这与我每次使用它时只为rsa类创建一个创建新实例的实例有关。

1 个答案:

答案 0 :(得分:1)

RSACryptoServiceProvider(int)构造函数生成一个新密钥(除非CAPI返回空名的密钥;我不确定是否可行)。因此,此代码使用一个密钥进行加密,并尝试使用另一个密钥进行解密。由此产生的答案使得抛出异常变得毫无意义。

  • 生成您的密钥一次,并从中保存RSAParameters。
  • 为了使您的代码更具可移植性,请避免说" RSACryptoServiceProvider&#34 ;;在可能的情况下,先谈谈RSA。
    • 不幸的是,密钥创建是一个不可能的时间,因为当KeySize发生变化时,RSACryptoServiceProvider不会生成新密钥。

所以你应该在.NET 4.6或更高版本上使用更像这样的东西:

public static byte[] RSAEncrypt(
    byte[] byteEncrypt,
    RSAParameters rsaInfo,
    RSAEncryptionPadding padding)
{
    try
    {
        using (RSA rsa = RSA.Create())
        {
            rsa.ImportParameters(rsaInfo);
            return rsa.Encrypt(byteEncrypt, padding);
        }
    }
    catch (CryptographicException e)
    {
        Console.WriteLine(e.Message);
        return null;
    }
}