为什么 public 密钥 blob 在 .net Framework 4.7 中包含大端格式的密钥类型和密钥长度?

Why does public key blob contains key type and key length in big endian format in .net framework 4.7?

我写了下面的代码来提取 ECDH public key 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}");

我得到以下输出:

前4个字节(密钥类型)是45434B31(十六进制格式)。这似乎是大端格式,其中 this MSDN link 表示它应该是小端格式,这表明这 4 个字节应该是 314B4345(同样,如此 link 所示)。 link 也使用 "magic",而不是 "key type"。接下来的 4 个字节是 20000000(十六进制格式)似乎是小端格式(如上面 link 所说)。

对于为什么键类型被格式化为大端,是否有合理的解释?或者我在这里遗漏了什么?

The first 4 bytes (key type) are 45434B31 (in hex format).

那将是 0x45434B31(Big Endian 解释)或 0x314B4345(Little Endian 解释)。 0x314B4345 (LE) 匹配您链接页面中的 nistP256 条目。

你的问题标题表明你认为长度是大端存储的,但你的问题body你说它似乎是小端。 LE是正确的。 200000000x00000020 (LE),或“32 字节字段”。 32 字节是 256 位,符合 nistP256 的预期答案。


请注意,您确实不想使用这种 blob 格式。 NIST P-256、384 和 521 曲线具有不同的 "magic" 值,但新的 Windows 10 条附加曲线均在 0x504B4345 (BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC) 下报告。曲线名需要外传

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