我花了几天时间搜索ECDH秘密协议的结构,但没有成功。我在MSDN中发现NCryptSecretAgreement函数设置了一个指向NCRYPT_SECRET_HANDLE变量的指针,该变量接收表示秘密协议值的句柄。我根本不熟悉WinAPI,所以除了阅读文档之外我什么也做不了。
我需要在基于Windows的桌面应用和网络应用之间交换密钥。 我需要知道的是CNG的KDF究竟是如何使用(在我的情况下是哈希)秘密协议值。我正在使用SHA-256算法作为KDF并尝试哈希X和Y的秘密协议但结果与CNG计算不符。有什么想法吗?
谢谢。
答案 0 :(得分:1)
我无法保证微软认为适合实施的内容,但有一个名为X9.63的ECDH标准。在该标准中,ECDH的工作方式如下:
你运行DH的东西,产生公共曲线点(X,Y)(这是你从对等点得到的点,乘以你的秘密DH值)。
您将 X (仅 X ; Y 被丢弃)转换为字节序列,我们将其称为ž。转换是无符号的big-endian,并使用字段大小:如果 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 导出到一个密钥中,使用散列函数 H ,其输出长度为 n 个字节(例如< em> n = 32 使用SHA-256),计算潜在的无限字符串 H 1 || H 2 || H 3 || ... 其中“ || ”表示连接, H i = H(Z || i) 其中“ i ”表示为四个字节,使用big-endian约定。简单来说,您将 Z 与32位计数器一起散列,并一次又一次地执行此操作,直到您有足够的字节用于预期的密钥长度。