我正在尝试创建一个简单的系统来加密字符串,将加密的字节数组转换为字符串并将其存储在数据库中。稍后,可以从数据库中检索值(作为字符串),转换为字节数组,解密,然后再次转换为字符串。我也使用256位密钥。但是,我似乎做错了什么,我对这个概念不够熟悉,无法提出修复。
加密代码:
private static string EncryptString(SymmetricAlgorithm symAlg, string inString)
{
byte[] inBlock = Encoding.Unicode.GetBytes(inString);
ICryptoTransform xfrm = symAlg.CreateEncryptor();
return Convert.ToBase64String(xfrm.TransformFinalBlock(inBlock, 0, inBlock.Length));
}
解密代码:
private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytes)
{
ICryptoTransform xfrm = symAlg.CreateDecryptor();
return xfrm.TransformFinalBlock(Convert.FromBase64String(inBytes), 0, inBytes.Length);
}
我在解密时遇到的错误:
System.ArgumentOutOfRangeException:尝试转换超出缓冲区的结尾。
参数名称:inputCount
在
System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount)
在
CDMEncryptionLibrary.SyncEncryption.SecureCDM.DecryptString(SymmetricAlgorithm symAlg,String inBytes)
据我所知,问题是从字节到字节的转换,但我该如何解决呢?
- 编辑
解密代码现在是:
private static string DecryptString(SymmetricAlgorithm symAlg, string inBytesString)
{
var inBytes = Convert.FromBase64String(inBytesString);
ICryptoTransform xfrm = symAlg.CreateDecryptor();
byte[] outBlock= xfrm.TransformFinalBlock(inBytes, 0, inBytes.Length);
return Encoding.Unicode.GetString(outBlock);
}
有错误输入数据不是一个完整的块。
答案 0 :(得分:3)
您传递字符串的长度,而不是您将字符串转换为字节数组的长度。
即。您将Convert.FromBase64String(inBytes)作为第一个参数传递,但将inBytes.Length作为最后一个参数传递。在取长度之前简单转换;
private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytes)
{
ICryptoTransform xfrm = symAlg.CreateDecryptor();
return xfrm.TransformFinalBlock(Convert.FromBase64String(inBytes), 0, Convert.FromBase64String(inBytes).Length);
}
或更具可读性;
private static byte[] DecryptString(SymmetricAlgorithm symAlg, string inBytesString)
{
var inBytes = Convert.FromBase64String(inBytesString);
ICryptoTransform xfrm = symAlg.CreateDecryptor();
return xfrm.TransformFinalBlock(inBytes, 0, inBytes.Length);
}