AES解密,长度无效

时间:2014-11-30 16:42:40

标签: c# encryption aes

我有服务器客户端。服务器加密消息并发送到客户端。 客户端想要解密,但程序崩溃并且错误说:要解密的数据长度无效。

这是代码,我在哪里监听服务器。

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

我该如何修复这个长度?

1 个答案:

答案 0 :(得分:0)

.NET API是围绕流构建的。请尝试使用CryptoStream API,并使用AesCryptoServiceProvider进行初始化。 TransformFinalBlock只应用于低级别访问,并且仅用于密文的最后一个字节。

引用:

  

TransformFinalBlock是一个特殊函数,用于转换流中的最后一个块或部分块。它返回一个包含剩余转换字节的新数组。返回一个新数组,因为在添加填充时,最后返回的信息量可能大于单个块。