使用AES解密大文件

时间:2016-04-28 17:18:02

标签: c# encryption aes

我试图解密500 MB的数据,并且我在较大的文件上获得了内存不足的异常,所以解密适用于较小的文件,无论如何,我可以确保我没有得到这个内存异常?

key.file的第一部分是IV,key.file的第二部分是密钥。

我的机器有32 gb的内存,所以它不是本地问题。

代码在此行中断:var so = decrTransform.TransformFinalBlock(file,0,file.Length);

private void DecryptData()         {

        X509Certificate2 cert;

        var storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), "LocalMachine", true);
        var storeName = (StoreName)Enum.Parse(typeof(StoreName), "My", true);
        var findType = (X509FindType)Enum.Parse(typeof(X509FindType), "FindByThumbprint", true);
        string thumbprint = Thumb;

        try
        {
            X509Store certStore = new X509Store(storeName, storeLocation);
            certStore.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection certCollection = certStore.Certificates.Find(findType,
                thumbprint, false);
            certStore.Close();
            cert = new X509Certificate2(certCollection[0]);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        RijndaelManaged alg = new RijndaelManaged();

        try
        {
            var asd = ((RSACryptoServiceProvider)cert.PrivateKey).Decrypt("file.key.path"), true);

            var iv = new byte[16];
            Buffer.BlockCopy(asd, 0, iv, 0, 16);

            var key = new byte[32];
            Buffer.BlockCopy(asd, 16, key, 0, 32);
            alg.Padding = PaddingMode.PKCS7;
            alg.Mode = CipherMode.CBC;



            using (ICryptoTransform decrTransform = alg.CreateDecryptor(key, iv))
            {
                byte[] file = ReadFile(@"encrypted.file.path");


                    var so = decrTransform.TransformFinalBlock(file, 0, file.Length);
                    File.WriteAllBytes(@"SavedData.path", so);




                decrTransform.Dispose();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

1 个答案:

答案 0 :(得分:2)

尝试使用流,尤其是CryptoStreamMicrosoft example at the bottom of this page实际上使用RijndaelManaged执行基于文件的加密,因此您很幸运。首先,您需要从文件流中提取IV,例如通过逐字节读取完全 16个字节。只读完IV后才包裹流。

这样就不需要缓冲区大小以外的内存消耗,缓冲区大小应该在几KiB的最大值范围内。