我有服务器客户端。服务器加密消息并发送到客户端。 客户端想要解密,但程序崩溃并且错误说:要解密的数据长度无效。
这是代码,我在哪里监听服务器。
while (true)
{
if (tok.CanRead)
{
tok = client.GetStream();
int buffSize = 0;
byte[] inStream = new byte[10025];
tok.Read(inStream, 0, inStream.Length);
RijndaelManaged AesEncryption = new RijndaelManaged();
AesEncryption.KeySize = 256; // 192, 256
AesEncryption.BlockSize = 128;
AesEncryption.Mode = CipherMode.CBC;
AesEncryption.Padding = PaddingMode.PKCS7;
string keyStr = "cGFzc3dvcmQAAAAAAAAAAA==";
string ivStr = "cGFzc3dvcmQAAAAAAAAAAA==";
byte[] ivArr = Convert.FromBase64String(keyStr);
byte[] keyArr = Convert.FromBase64String(ivStr);
AesEncryption.IV = ivArr;
AesEncryption.Key = keyArr;
ICryptoTransform decrypto = AesEncryption.CreateDecryptor();
inStream = decrypto.TransformFinalBlock(inStream, 0, inStream.Length); //here is error
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readdata = "" + returndata;
msg();
}
}
我该如何修复这个长度?
答案 0 :(得分:0)
.NET API是围绕流构建的。请尝试使用CryptoStream API,并使用AesCryptoServiceProvider
进行初始化。 TransformFinalBlock只应用于低级别访问,并且仅用于密文的最后一个字节。
引用:
TransformFinalBlock是一个特殊函数,用于转换流中的最后一个块或部分块。它返回一个包含剩余转换字节的新数组。返回一个新数组,因为在添加填充时,最后返回的信息量可能大于单个块。