加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:32:56 所属栏目:百科 来源:网络整理
导读:我对C#很陌生,所以请耐心等待我.我知道这个问题在很多时候被问了很多,但是我找不到问题的答案. 我正在保存一些数据,在将其写入文件之前,我将其转换为二进制文件并将其存储在数组中,我将其加密然后写入文件.我以块(32字节)加密数据.以同样的方式,我以32字节的
我对C#很陌生,所以请耐心等待我.我知道这个问题在很多时候被问了很多,但是我找不到问题的答案.

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

Padding is invalid and cannot be removed.

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

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

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

        //setup encryption (AES)
        SymmetricAlgorithm aes = Aes.Create();
        byte[] key = { 145,12,32,245,98,132,214,6,77,131,44,221,3,9,50};
        byte[] iv = { 15,122,5,93,198,31,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,data.Length);
               data = m.ToArray();
               fStream.Write(data,data.Length);

这是我的解密代码:

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

            //setup encryption (AES)
            SymmetricAlgorithm aes = Aes.Create();
            byte[] key = { 145,50 };
            byte[] iv = { 15,7 };
            ICryptoTransform decryptor = aes.CreateDecryptor(key,iv);

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

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

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

                //using the decrypted data and then looping back to reading and decrypting...

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

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

谢谢你的时间和答案.

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

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

解决方法

根据您的编辑:

EDIT: It seems that the size of the encrypted data is 48 bytes (12 bytes more than the original). Why is that so? I thought that it only adds bytes if they are not a multiple of the block size (16 bytes,my data is 32 bytes). Is data always larger,and with constant increase (I need to know that in order to properly read and decrypt).

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

aes.Padding = PaddingMode.None;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读