为什么 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}");
我得到以下输出:
Public 密钥(带格式信息的字节长度):72
Public Key (hex with format info): 45434B3120000000C3F1AC1F3D272BE14A26BE35B1A31F6C969425259162C06BEBE6AE977809984FC509ED5154E1E4782079D4BDDCDA6E083E48D271755267AD765CAD0E66B9FD9F
前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是正确的。 20000000
是 0x00000020
(LE),或“32 字节字段”。 32 字节是 256 位,符合 nistP256 的预期答案。
请注意,您确实不想使用这种 blob 格式。 NIST P-256、384 和 521 曲线具有不同的 "magic" 值,但新的 Windows 10 条附加曲线均在 0x504B4345 (BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC) 下报告。曲线名需要外传
在 .NET 上导入和导出键值的正确答案是通过 ExportParameters
和 ImportParameters
方法的 ECParameters
结构。
我写了下面的代码来提取 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}");
我得到以下输出:
Public 密钥(带格式信息的字节长度):72
Public Key (hex with format info): 45434B3120000000C3F1AC1F3D272BE14A26BE35B1A31F6C969425259162C06BEBE6AE977809984FC509ED5154E1E4782079D4BDDCDA6E083E48D271755267AD765CAD0E66B9FD9F
前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是正确的。 20000000
是 0x00000020
(LE),或“32 字节字段”。 32 字节是 256 位,符合 nistP256 的预期答案。
请注意,您确实不想使用这种 blob 格式。 NIST P-256、384 和 521 曲线具有不同的 "magic" 值,但新的 Windows 10 条附加曲线均在 0x504B4345 (BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC) 下报告。曲线名需要外传
在 .NET 上导入和导出键值的正确答案是通过 ExportParameters
和 ImportParameters
方法的 ECParameters
结构。