【问题标题】:Why does public key blob contains key type and key length in big endian format in .net framework 4.7?为什么公钥 blob 在 .net framework 4.7 中包含大端格式的密钥类型和密钥长度?
【发布时间】:2017-09-03 20:50:51
【问题描述】:

我编写了以下代码来提取 ECDH 公钥 blob:

        var curve = ECCurve.NamedCurves.nistP256;
        ECDiffieHellman ecdh = ECDiffieHellman.Create(curve);

        var bytes = ecdh.PublicKey.ToByteArray();
        Console.WriteLine($"Public Key (byte length with format info): {bytes.Length}");

        var hexString = BitConverter.ToString(bytes).Replace("-", string.Empty);
        Console.WriteLine($"Public Key (hex with format info): {hexString}");

我得到以下输出:

  • 公钥(带格式信息的字节长度):72

  • 公钥(十六进制格式信息):45434B3120000000C3F1AC1F3D272BE14A26BE35B1A31F6C06BEBE6AE977809984FC509D5201C50909989259209984FC50909989259207998920C50980998CS

前 4 个字节(密钥类型)是 45434B31(十六进制格式)。这似乎是大端格式,this MSDN link 表示它应该是小端格式,这表明这 4 个字节应该是 314B4345(再次,如链接所示)。该链接还使用“魔术”,而不是“键类型”。接下来的 4 个字节是 20000000(十六进制格式)似乎是小端格式(如上面的链接所述)。

对于为什么键类型被格式化为大端有一个合乎逻辑的解释吗?还是我在这里遗漏了什么?

【问题讨论】:

  • Little-endian 表示最低有效字节(0x45)在前。

标签: .net encryption cryptography elliptic-curve


【解决方案1】:

前 4 个字节(密钥类型)为 45434B31(十六进制格式)。

那将是0x45434B31(大端解释)或0x314B4345(小端解释)。 0x314B4345 (LE) 与链接页面中的 nistP256 条目匹配。

您的问题标题表明您认为存储的长度是大端,但您的问题主体说它似乎是小端。乐是正确的。 200000000x00000020 (LE),或“32 字节字段”。 32 字节是 256 位,这与 nistP256 的预期答案相匹配。


请注意,您确实不想使用这种 blob 格式。 NIST P-256、384 和 521 曲线具有不同的“神奇”值,但新的 Windows 10 附加曲线均报告在 0x504B4345 (BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC) 下。曲线名称必须外接。

.NET 上导入和导出键值的正确答案是通过 ExportParametersImportParameters 方法的 ECParameters 结构。

【讨论】:

  • 您对我关于密钥长度的描述是正确的。但是,当实际值显示为大端时,为什么文档说“魔术”(键类型)应该是小端?
  • 文档将值显示为数字常量。 Big/Little Endian 是关于值的存储。如果(在 C 中)您在 x86/x64 系统上编写了*blob = 0x314B4345,则检查内存,它将显示为45 43 4B 31
  • 我同意你的观点,这通常是一个存储问题。当我调用 ToByteArray() 并获取结果字节时,我不再解释字节(因为这已经为我完成了)。因此,为了保持一致性,我希望将第一个字节 8 视为 314B434520000000(而不是 45434B3120000000)。我在这里错过了什么吗?
  • 您缺少的是底层 API 使用第一个值为 DWORD 的结构,因此他们希望每个人都进行结构覆盖。所以他们考虑的是结构和逻辑值,而你考虑的是字节。这就是断开连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2016-04-15
  • 2010-11-05
  • 2011-09-03
  • 2012-05-31
  • 2010-09-21
  • 2012-11-24
相关资源
最近更新 更多