如何获取本地加密文件作为FileStream?

问题描述 投票:0回答:1

我有本地存储的文件使用aes加密

我需要代码中解密形式的文档之一作为流。 我来回尝试,但无法使其工作。

该方法必须是什么样子,以便我可以用解密的内容取回流。

public Stream DecryptFile(string filePath){..??..}

我的加密方法如下:

public async Task EncryptAndSaveFileAsync(Stream stream, string filePath)
{
    await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);

    var tempFilePath = Path.GetTempFileName();

    try
    {
        if (!stream.CanRead)
        {
            stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        }

        await using (var tempFileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
        {
            await stream.CopyToAsync(tempFileStream);
        }

        fileStream.Close();

        try
        {
            await using var inputFileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read);

            await using (var outputFileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                using var aesAlg = Aes.Create();
                aesAlg.Key = _key;
                aesAlg.IV = new byte[16];

                await using var cryptoStream = new CryptoStream(outputFileStream, aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write);
                await inputFileStream.CopyToAsync(cryptoStream);
            }

            inputFileStream.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Fehler beim Verschlüsseln der Datei: " + ex.Message);
        }
    }
    catch (Exception ex)
    {
        // TODO FM Logging
    }
    finally
    {
        File.Delete(tempFilePath);
    }
}
c# .net encryption .net-8.0
1个回答
0
投票

您的加密代码一开始就是错误的:

  • 无需搞乱临时文件。您可以直接写信给
    cryptoStream
  • 不要删除
    IV
    ,它是安全生成的,需要存在以保证算法的安全。
  • IV 应位于加密结果之前或之后。
  • 将密钥和 IV 传递给
    CreateEncryptor
    是没有意义的,这是默认值。
public async Task EncryptAndSaveFileAsync(Stream stream, string filePath)
{
    await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);

    using var aesAlg = Aes.Create();
    aesAlg.Key = _key;
    await fileStream.WriteAsync(aesAlg.IV.AsMemory());

    await using var cryptoStream = new CryptoStream(fileStream, aesAlg.CreateEncryptor(), CryptoStreamMode.Write);

    await inputFileStream.CopyToAsync(cryptoStream);
}

那么解密反过来也是一样的。

public async Task<Stream> DecryptFile(string filePath)
{
    await using var fileStream = File.OpenRead(filePath);

    using var aesAlg = Aes.Create();
    aesAlg.Key = _key;
    var iv = new byte[16];
    await fileStream.ReadExactlyAsync(_iv.AsMemory());
    aesAlg.IV = iv;

    await using var cryptoStream = new CryptoStream(fileStream, aesAlg.CreateEncryptor(), CryptoStreamMode.Read);

    var mem = new MemoryStream();
    await cryptoStream.CopyToAsync(mem);
    return mem;
}
© www.soinside.com 2019 - 2024. All rights reserved.