【发布时间】:2018-05-21 09:29:44
【问题描述】:
我正在现有文件管理程序中实施本地加密。
我能找到的大部分示例代码,例如Microsoft's,演示了如何直接写入文件,但我需要做的是提供一个流,以便在程序的其他地方使用:
CryptoStream GetEncryptStream(string filename)
{
var rjndl = new RijndaelManaged();
rjndl.KeySize = 256;
rjndl.BlockSize = 256;
rjndl.Mode = CipherMode.CBC;
rjndl.Padding = PaddingMode.PKCS7;
// Open read stream of unencrypted source fileStream:
var fileStream = new FileStream(filename, FileMode.Open);
/* Get key and iv */
var transform = rjndl.CreateEncryptor(key, iv);
// CryptoStream in *read* mode:
var cryptoStream = new CryptoStream(fileStream, transform, CryptoStreamMode.Read);
/* What can I do here to insert the unencrypted IV at the start of the
stream so that the first X bytes returned by cryptoStream.Read are
the IV, before the bytes of the encrypted file are returned? */
return cryptoStream; // Return CryptoStream to be consumed elsewhere
}
我的问题在最后一行的评论中有一个概述:我如何将 IV 添加到 CryptoStream 的开头,以便在读取 CryptoStream 时返回第一个 X 字节,前提是控制何时真正开始读取流并写入文件超出了我的代码范围吗?
【问题讨论】:
-
这是我的加密方法。当我无法控制流的使用时,问题是在 IV 之前。上面的代码(松散地)基于 MS 代码,主要区别在于我不能直接写入文件,因为我必须将对流的控制推迟到应用程序的其他处理进度条等内容的部分。
-
两种模式都有效,这就是它们存在的原因。我正在使用读取模式,因为在这种情况下它是必要的。
-
@xanatos 不,它是未加密的流。作者希望在读取模式下提供一个
CipherStream,它返回密文,而另一方控制如何/何时可以读取它。希望是因为它在同一个线程中。 -
@MaartenBodewes 现在很清楚了:-)
标签: c# encryption aes