-2

这是代码 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace AESFileDecrypt
{
    class Program
    {
        static void Main(string[] args)
        {
            RijndaelManaged aes = new RijndaelManaged();
            aes.Key = Encoding.ASCII.GetBytes("12345678");
            aes.IV = new byte[0x10];
            aes.Padding = PaddingMode.None;
            aes.Mode = CipherMode.ECB;
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            byte[] data = File.ReadAllBytes(@"C:\enc.aes");
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
                {                
                    cs.Write(data, 0, data.Length);
                    cs.FlushFinalBlock();
                    File.WriteAllBytes(@"C:\dec.txt", ms.ToArray());
                }
            }
        }
    }
}

我面临的两个错误 -

1 - “要解密的数据长度无效”

我猜这发生在 FlushFinalBlock 上。

2 - “'System.OutOfMemoryException'”

这发生在大文件上。

我已经阅读了许多类似的页面,但无法为这样的解密修复它。

有什么帮助吗?

问候

4

1 回答 1

1

这么多安全错误:

  1. 除非要加密的数据始终是块大小的精确倍数,否则 ECB(和 CBC)模式必须使用填充模式。这是因为 AES 是基于块的。

  2. 内存不足是因为整个文件一次都很好:File.ReadAllBytes,在流代码中读取较小的块..

  3. 使用与支持的密钥大小(128、192 或 256 位)完全相同的密钥。填充键没有标准,短键也不安全。

  4. 假设ASCII几乎总是一个糟糕的选择,通常正确的选择是UTF-8.

  5. ECB 模式不使用 IV。在 CBC 模式下,IV 应该是块大小和随机字节。

  6. 新作品中不要使用ECB模式,不安全,请参阅ECB模式,向下滚动到企鹅。而是使用随机 IV 的 CBC 模式,只需在加密数据前加上 IV 以用于解密,它不需要保密。

于 2018-03-02T12:52:58.567 回答