如何异步解密文件并将其转换为C#

时间:2016-03-13 03:24:51

标签: c# encryption

是否可以异步解密文件并将其转换为字节? 字节数据将被转换为另一个对象,如图像或其他东西。

所以,我想decypt文件,而不必将其保存到实际文件中,例如:

我加密了一张图片,我希望在不保存到真实文件的情况下对其进行解密,在这种情况下,解密后的文件就是图像。

因此,从我的观点来看,最好的方法是从异步读取加密文件中的字节并将字节转换为图像。

我需要线索的人,即使没有代码示例,我也很感激。感谢。

我使用msdn:

中的基本代码加密了文件
 private static void encrypt(string fileInput,
                                string fileOutput,
                                string key)
    {
        FileStream fInput = new FileStream(fileInput, FileMode.Open, FileAccess.Read);
        FileStream fOutput = new FileStream(fileOutput, FileMode.Create, FileAccess.Write);
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        des.Key = ASCIIEncoding.ASCII.GetBytes(password);
        des.IV = ASCIIEncoding.ASCII.GetBytes(password);

        ICryptoTransform encryptor = des.CreateEncryptor();
        CryptoStream cryptostream = new CryptoStream(fOutput, encryptor, CryptoStreamMode.Write);

        Byte[] byteArrayInput = new byte[fInput.Length];
        fInput.ReadAsync(byteArrayInput, 0, byteArrayInput.Length);
        cryptostream.WriteAsync(byteArrayInput, 0, byteArrayInput.Length);
        cryptostream.Close();
        fInput.Close();
        fOutput.Close();
        des.Dispose();
    }

1 个答案:

答案 0 :(得分:1)

首先:

  • 首选使用using而不是手动处理您的信息流。
  • Streams并不是唯一的一次性物品,所以你不必担心,因为例如DESCryptoServiceProvider确实是一次性的。
  • 包装器方法应该是async方法,以便能够将await与异步调用一起使用。

您可以使用MemoryStream

using (var fInput = new FileStream(fileInput, FileMode.Open, FileAccess.Read))
using (var ms = new MemoryStream())
{
    using (var des = new DESCryptoServiceProvider())
    {
        des.Key = ASCIIEncoding.ASCII.GetBytes(password);
        des.IV = ASCIIEncoding.ASCII.GetBytes(password);

        ICryptoTransform encryptor = des.CreateEncryptor();
        using (var cryptostream = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            // Here, we're writing to the cryptoStream which will write to ms.
            await fInput.CopyToAsync(cryptostream);
        }

        // Do something with ms here.
        // If you want a byte array just do: ms.ToArray()
    }
}

很多api会要求你StreamMemoryStream扩展了Stream,因此您可以ms向他们发送using,但请确保您在ms的{​​{1}}区域内执行此操作。

如果您只需要最终结果中的字节数组,则可以使用ms.ToArray()。这样,如果您愿意,您可以使用using块外部的字节数组。