【问题标题】:ProtectedMemory - How To Ensure That The Size Of The Byte Array Is A Multiple Of 16?ProtectedMemory - 如何保证字节数组的大小是16的倍数?
【发布时间】: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


【解决方案1】:

是的,只是为了迭代 cmets 中给出的可能性(并给出这个好问题的答案),您可以使用:

  1. 一种也用于分组密码模式的填充方法,请参阅Wikipedia page on the subject 上的所有选项。
  2. 以某种形式为长度添加前缀。 32 位/4 字节的固定大小可能是最简单的。请记下大小的编码类型(无符号,小端可能最适合 C#)。

这两个都已经对字节进行了操作,所以如果你使用字符串,你可能需要定义一个字符编码,比如 UTF-8。

您还可以使用特定的字符串编码,例如一个由 ASN.1 / DER 定义,然后执行零填充。这样,您甚至可以指示以独立于平台的方式编码的数据类型。在走这条路之前,您可能需要先了解受虐狂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 2016-12-10
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多