我正在使用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类创建一个创建新实例的实例有关。
答案 0 :(得分:1)
RSACryptoServiceProvider(int)构造函数生成一个新密钥(除非CAPI返回空名的密钥;我不确定是否可行)。因此,此代码使用一个密钥进行加密,并尝试使用另一个密钥进行解密。由此产生的答案使得抛出异常变得毫无意义。
所以你应该在.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;
}
}