【发布时间】:2020-11-06 11:55:59
【问题描述】:
我正在阅读 C# 中的 ProtectedMemory 类(它使用 Windows 中的数据保护 API (DPAPI)),我看到为了使用该类的 Protect() 方法,数据是加密后必须存储在大小/长度为 16 的倍数的字节数组中。
我知道如何将许多不同的数据类型转换为字节数组形式并再次转换回来,但是我如何保证字节数组的大小是 16 的倍数?我真的需要创建一个大小为 16 的倍数的数组,并使用另一个变量来跟踪原始数据的长度,还是我遗漏了什么?使用传统的分组密码,所有这些细节都会通过填充设置自动为您处理。同样,当我尝试将数据从字节数组转换回其原始形式时,我如何确保忽略任何其他字节,当然假设原始数据不是 16 的倍数。
在 .NET Framework 文档中提供的代码示例中,使用的字节数组恰好是 16 个字节长,因此我不确定与此相关的最佳实践是什么,因此提出了问题。
【问题讨论】:
-
Find the next multiple of 16 >= 数据长度 + 4,创建一个字节数组,将保存数据长度的 int32 的 4 个字节复制到数组的开头,然后复制数据。解码将第一个 4 字节复制到 int32 并从索引 4 读取那么多字节。
-
是的,您必须创建一个 16 的倍数的数组。要恢复正确的长度,您可以使用 PKCS7 padding,这很容易处理。
标签: c# .net winapi cryptography data-protection-class