使用Windows数据保护API,可以如下面的代码示例了内存中的数据进行加密,:使用DPAPI加密而不泄露未加密数据的长度?
byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes("ThisIsSomeData16");
Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
Console.WriteLine("Encrypting...");
// Encrypt the data in memory.
EncryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);
Console.WriteLine("Encrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
Console.WriteLine("Decrypting...");
// Decrypt the data in memory.
DecryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);
Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
请参阅Microsoft参考这里:https://msdn.microsoft.com/en-us/library/ms995355.aspx
然而,在这个例子中encypted数据与原始数据大小相同。有没有办法利用DPAPI来加密数据而不会泄露原始文件的文件大小?例如,将密钥生成的密文隐藏在密钥中的“随机”位置,尽可能使用一次性密码?
为什么不简单地将输入数据构造为length + data + padding? –
当然,虽然这需要在解密后解析数据,但我觉得这应该是一个常见的问题,已经有一些实现 –
这取决于DPAPI加密的质量,以及您对可能性的关心程度已知的明文攻击。另一种可能性是生成一个密钥,将其用于适当的块加密(如'AesCryptoServiceProvider'),并使用DPAPI保护密钥,所以已知长度不是问题。 –