这是代码 -
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'”
对于大文件会发生这种情况。
我已阅读过类似的许多页面,但无法修复此类解密。
任何帮助?
此致
答案 0 :(得分:1)
这么多安全错误:
除非要加密的数据始终是块大小的精确倍数,否则必须将填充模式用于ECB(和CBC)模式。这是因为AES是基于块的。
内存不足是因为整个文件一次性很好:File.ReadAllBytes
,在流代码中读取较小的块..
使用一个密钥,使用支持的密钥大小,128,192或256位。填充键没有标准,短键不安全。
假设ASCII
几乎总是不错的选择,通常正确的选择是UTF-8
。
ECB模式不使用IV。在CBC模式下,IV应该是块大小和随机字节。
不要在新作品中使用ECB模式,它不安全,请参阅ECB mode,向下滚动到企鹅。相反,使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密,它不需要保密。