2

我花了几天时间搜索ECDH秘密协议的结构,但没有成功。我在 MSDN 中发现NCryptSecretAgreement函数设置了一个指向 NCRYPT_SECRET_HANDLE 变量的指针,该变量接收代表秘密协议值的句柄。我根本不熟悉 WinAPI,所以除了阅读文档之外我什么也做不了。

我需要在基于 Windows 的桌面应用程序和 Web 应用程序之间交换密钥。我需要知道的是 CNG 的 KDF 究竟如何使用(在我的情况下是散列)秘密协议值。我使用 SHA-256 算法作为 KDF 并尝试对秘密协议的 X 和 Y 进行散列,但结果与 CNG 计算的一个不匹配。有任何想法吗?

谢谢你。

4

1 回答 1

1

我无法保证 Microsoft 认为适合实施的内容,但 ECDH 上有一个名为X9.63的标准。在该标准中,ECDH 的工作方式如下:

  • 你运行 DH 的东西,产生公共曲线点(X, Y)(这是你从对等点得到的点,乘以你的秘密 DH 值)。

  • 您将X(并且只有XY被丢弃)转换为我们称为Z的字节序列。转换是无符号大端,并使用字段大小:如果X存在于字段F q中,则转换正好产生ceil(ceil(log q)/8)。例如,如果您使用 NIST P-521 曲线,则您以素数q为模工作,即2 520 < q < 2 521,因此ceil(log q) = 521并且生成的字节序列正好包含 66 个字节,无论值X. 使用最常用的椭圆曲线(称为“P-256”),即 32 个字节。

  • 为了将Z导出为密钥,使用输出长度为n字节的散列函数H (例如,使用 SHA-256 的n = 32),您计算可能无限的字符串H 1 ||H 2 ||H 3 ||。 ..其中“ || ”表示连接,H i = H(Z||i)其中“ i ”表示为四个字节,使用大端约定。简而言之,您将Z与一个 32 位计数器一起散列,并一次又一次地这样做,直到您有足够的字节用于您的预期密钥长度。

于 2011-10-31T12:30:52.007 回答