我正在研究一些理想情况下可以使用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[]
以外没有其他重载,因此无论如何我都找不到解决此问题的方法,以允许对大文件进行加密而又不会对数据进行分块。
有什么办法可以解决这个问题?
答案 0 :(得分:0)
如果查看ProtectedData.Protect
的{{3}},您会发现在某个时候它会将调用重定向到Crypt32库:source code。
在CryptProtectData function部分,您将看到:
该函数创建一个会话密钥以执行加密。要解密数据时,会再次导出会话密钥。
在我看来,这就像每次调用该函数时都会生成一个新密钥。
因此,如果您每次都需要获得相同的值,那么最好使用AES。