.NET中AES加密的多线程实现

4sup72z8  于 2023-06-07  发布在  .NET
关注(0)|答案(1)|浏览(392)

我写了一个程序,用AES加密文件。加密过程在文件流上完成。

  • 加密方式:*
public static async Task EncryptUsingAESAsync(FileStream fileReadStream, FileStream fileWriteStream, byte[] key, byte[] iv)
{
    using(Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = key;
        aesAlg.IV = iv;

        ICryptoTransform encryptor = aesAlg.CreateEncryptor();

        using(CryptoStream cryptoStream = new CryptoStream(fileWriteStream, encryptor, CryptoStreamMode.Write))
        {
            await fileReadStream.CopyToAsync(cryptoStream);
        }
    }
}
  • 此方法将被调用 *
public static async Task EncryptFileStreamAsync(string absolutePath, byte[] key, byte[] iv)
{
    using(FileStream fReadStream = new FileStream(absolutePath, FileMode.Open, FileAccess.Read))
    {
        using(FileStream fWriteStream = new FileStream($"{absolutePath}.EWW", FileMode.CreateNew, FileAccess.Write))
        {
            await fWriteStream.WriteAsync(iv, 0, iv.Length);
            await CryptoProvider.EncryptUsingAESAsync(fReadStream, fWriteStream, key, iv);
        }
    }

    File.Delete(absolutePath);
}

我读到.NET中的AES实现实际上使用了Windows加密API。那么,我可以等待这些方法(特别是EncryptUsingAESAsync方法),比如异步IO,还是应该在TaskFactoy.StartNew()中显式调用它,以便在单独的线程上完成?还是有其他方法可以获得多线程的好处?

fxnxkyjh

fxnxkyjh1#

这取决于你的目标是什么,以及你所关注的环境。如果您受到磁盘IO的限制,您将看不到并行运行这些活动的任何好处。
就我个人而言,我会在类似的环境中获得一些典型的文件集,并使用一些实现对其进行基准测试,但我也会将List<Task>.WhenAny(或.WhenAll)添加到您的潜在实现列表中进行检查。
如果你需要一个快速的解决方案,我可能会走异步路线,因为这将由运行时管理(你已经构建了任务),如果它有环境开销来管理它,它将并行运行多个任务。我不确定CryptoProvider.EncryptUsingAESAsync是否是内部多线程的,这可能会增加更多的考虑因素。

相关问题