对文件使用ProtectedData.Protect()

时间:2018-10-16 23:05:58

标签: c# .net windows encryption cryptography

我正在研究一些理想情况下可以使用Windows DPAPI加密文件的代码。如果可以将文件直接读取到内存中,这很好,但是如果不能,则无法对其进行加密。 ProtectedData.Protect接受3个参数-数据作为字节数组,可选的熵作为字节数组,以及范围。

当我按以下方式使用它时,它会产生2种不同的结果:

var data = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};

byte[] encryptedDataA = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

byte[] encryptedDataB = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

Console.WriteLine(encryptedDataA.SequenceEqual(encryptedDataB));

// False!!!!

指定相同的熵也会导致不同的结果。 Here是MSDN的一个佐证。但是,没有任何文档可以找到有关标题或如何读取它的详细信息。

由于除了byte[]以外没有其他重载,因此无论如何我都找不到解决此问题的方法,以允许对大文件进行加密而又不会对数据进行分块。

有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果查看ProtectedData.Protect的{​​{3}},您会发现在某个时候它会将调用重定向到Crypt32库:source code

CryptProtectData function部分,您将看到:

  

该函数创建一个会话密钥以执行加密。要解密数据时,会再次导出会话密钥。

在我看来,这就像每次调用该函数时都会生成一个新密钥。

因此,如果您每次都需要获得相同的值,那么最好使用AES。