C#:AES错误:填充无效,无法删除.相同的钥匙和一切,帮助

Ben*_*Ben 6 c# aes padding

我对C#很陌生,所以请耐心等待我.我知道这个问题在很多时候被问了很多,但是我找不到问题的答案.

我正在保存一些数据,在将其写入文件之前,我将其转换为二进制文件并将其存储在数组中,我将其加密然后写入文件.我以块(32字节)加密数据.以同样的方式,我以32字节的块读取数据,然后解密该数据,然后这应该重复,直到文件结束.但是当涉及到解密时,会抛出以下错误:

填充无效,无法删除.

我使用相同的密钥和iv(硬编码直到我工作)

这是我的加密代码,没有问题:

        //result
        byte[] data = new byte[32];

        //setup encryption (AES)
        SymmetricAlgorithm aes = Aes.Create();
        byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9,50};
        byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
        ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);

        FileStream fStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 1024, false);

        //prepare data to write (byte array 'data') ...

        //encrypt
               MemoryStream m = new MemoryStream();
               using (Stream c = new CryptoStream(m, encryptor, CryptoStreamMode.Write))
                   c.Write(data, 0, data.Length);
               data = m.ToArray();
               fStream.Write(data, 0, data.Length);
Run Code Online (Sandbox Code Playgroud)

这是我的解密代码:

FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false);

            //setup encryption (AES)
            SymmetricAlgorithm aes = Aes.Create();
            byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
            byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
            ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);

            //result
            byte[] data = new byte[32];

            //loop for reading the whole file ...
            int len = fStream.Read(data, 0, 32);

            //decrypt
                MemoryStream m = new MemoryStream();
                using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
                    c.Write(data, 0, data.Length); //The exception is thrown in this line                  
                data = m.ToArray();

                //using the decrypted data and then looping back to reading and decrypting...
Run Code Online (Sandbox Code Playgroud)

我尝试了所有我能想到的(这不是很多,因为我对密码学很新),我到处搜索,我找不到解决问题的方法.我还在Nutshell中帮助自己学习了C#这本书.

如果有人知道为什么会发生这种情况我会非常感激,因为我没有想法.

谢谢你的时间和答案.

编辑:似乎加密数据的大小是48字节(比原始数据多12个字节).为什么会这样?我认为如果它们不是块大小的倍数(16字节,我的数据是32字节),它只会添加字节.数据总是更大,并且不断增加(我需要知道为了正确读取和解密).

注意:我不能直接使用其他流,因为我需要控制输出格式,我相信它在内存中加密也更安全,更快.

SwD*_*n81 6

根据您的编辑:

编辑:似乎加密数据的大小是48字节(比原始数据多12个字节).为什么会这样?我认为如果它们不是块大小的倍数(16字节,我的数据是32字节),它只会添加字节.数据总是更大,并且不断增加(我需要知道为了正确读取和解密).

如果加密数据是48个字节,那比原始数组大16个字节.这是有道理的,因为算法使用填充数据,因为默认值是PKCS7(即使大小与块大小匹配,因为它填充到块大小的下一个倍数).如果您希望将其保留为32个字节,只需将Padding更改为None

aes.Padding = PaddingMode.None;
Run Code Online (Sandbox Code Playgroud)