gpt4 book ai didi

c# - ECDiffieHellmanCng PublicKey 总是一样的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:48 27 4
gpt4 key购买 nike

我正在使用 C# ECDiffieHellmanCng 类并使用 sample 中的代码发现了一个(在我看来很奇怪的)行为:任何项目中生成的每个公钥都是一样的!这是正确的行为吗?

例子:

using (ECDiffieHellmanCng bob = new ECDiffieHellmanCng())
{
bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
bob.HashAlgorithm = CngAlgorithm.Sha256;
Trace.WriteLine(Encoding.UTF8.GetString(bob.PublicKey.ToByteArray()));
}

跟踪将始终以“ECK5B”作为输出。使用不同的构造函数只会使输出略有不同,但事实并非如此,因为它始终是相同的。我是否误解了什么,这个结果符合预期,没有机会提供随机公钥?我只是认为系统会使用更多的随机性。

最佳答案

ToByteArray() 方法,返回(特定于 Windows)CNG blob描述 key 。

blob布局是

UINT32 Magic
UINT32 cbKey
<cbKey bytes of public key>

BCRYPT_ECDH_PUBLIC_P521_MAGIC 的值为 0x354B4345,如果以 Little-Endian 顺序 (45 43 4B 35) 查看,则为 ASCII 字符串 ECK5。 NIST P-521 曲线上某个点的 x 坐标最多需要 521 位,或 ((521+7)/8) == 66 字节。 (UINT32)66 在 Little-Endian 中是 42 00 00 00。因此所有字节数组(对于基于 NIST P-521 的公钥)都将以

45 43 4B 35 42 00 00 00

(然后还有 66 个字节的 ECPoint 的 X 组件)。由于 ASCII 字符串在读取第一个 0x00 时将终止,因此它被解释(作为字符串)为 ECK5B

正如您已经发现的那样,该值实际上并不是一个字符串,因此为了将其视为一个字符串,需要将其编码为字符串安全格式,例如十六进制或 Base64。由于十六进制是 1=>2 编码(或 1=>~3 带空格),而 Base64 是 3=>4 编码,因此大多数应用程序最终都使用 Base64。

关于c# - ECDiffieHellmanCng PublicKey 总是一样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com