繁体   English   中英

VB.Net加密文件增加字节数组x7

[英]VB.Net Encryption File increase byte array x7

我可以加密100 mb或更小的文件,但是我将文件字节传输到阵列内存使用量增加了7倍,并且程序通过了2 gb内存限制

示例Test.rar大小100 mb

加密后

程序使用700 mb的ram,如果通过300 mb或更高的结果,则SystemOutOfMemory异常

    ' AesCryptoServiceProvider


    Dim aes As New AesCryptoServiceProvider()
    aes.BlockSize = 128
    aes.KeySize = 256


    aes.Key = Encoding.UTF8.GetBytes("12K2K2K2K2K2K2K212K2K2K2K2K2K2K2")
    aes.IV = Encoding.UTF8.GetBytes("12K2K2K2K2K2K2K2")

    aes.Mode = CipherMode.CBC
    aes.Padding = PaddingMode.PKCS7

    ' Convert string to byte array
    Dim src As Byte() = My.Computer.FileSystem.ReadAllBytes("C:\TestFolder\Test.rar")


    ' encryption
    Using enc As ICryptoTransform = aes.CreateEncryptor()
        Dim dest As Byte() = enc.TransformFinalBlock(src, 0, src.Length)










        Dim ms As New MemoryStream 'Create New Memory Space

        Dim cs As New CryptoStream(ms, aes.CreateEncryptor, mode:=CryptoStreamMode.Write) 'Write İn Ms
        cs.Write(dest, 0, dest.Length)
        cs.Close()

        Dim ss() As Byte = ms.ToArray




        My.Computer.FileSystem.WriteAllBytes("C:\TestFolder\TestCopy.rar", ss, True)



        ms.Dispose()
        cs.Dispose()
        src = Nothing
        ss = Nothing
        dest = Nothing

好吧,是的,您将整个文件读入内存,然后一次性加密整个文件。 您不需要这样做-您可以采用流式处理方法来完成整个操作。

您需要三个流:

  • 一股流从中读取输入
  • 一流写入磁盘
  • 封装第二流的加密流

然后只需使用Stream.CopyTo将输入流复制到加密流即可。

在C#中,它看起来像这样:

using (var input = File.OpenRead(@"C:\TestFolder\Test.rar"))
using (var output = File.Create(@"C:\TestFolder\Test.rar.encrypted"))
using (var crypto = New CryptoStream(output, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
    input.CopyTo(crypto);
}

希望您可以轻松地将其转换为VB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM