从类ecdiffiehellmanng中提取共享密钥

本文关键字:共享 密钥 提取 ecdiffiehellmanng 从类 | 更新日期: 2023-09-27 17:53:03

我目前正在开发一个SSH客户端,该客户端必须能够通过ECDH KEX (NIST-256, 384和521)与服务器交换密钥。

我做了一些(实际上是很多)研究,找到了。net类ECDiffieHellmanCng,并且能够提取并导入服务器的公钥到该类中。

然而,问题是我不能在不派生它(ECDiffieHellmanCng.DeriveKeyMaterial(CngKey otherpartyPublicKey))的情况下提取共享秘密。

是否有直接访问共享秘密("k",因为它在RFC文件中被称为)的方法?

这是ECDH实现的RFC的第7页,以及为什么我需要共享密钥:

交换哈希值H被计算为连接的哈希值以下。

字符串V_C,客户端标识字符串(CR和LF除外)

字符串V_S,服务器标识字符串(CR和LF除外)

string I_C,客户端SSH_MSG_KEXINIT的有效载荷

字符串I_S,服务器的SSH_MSG_KEXINIT的有效载荷

字符串K_S,服务器的公共主机密钥

Q_C,客户端临时公钥octet string

字符串Q_S,服务器的临时公钥octet string

int K,共享秘密<——这就是为什么我需要纯秘密在任何推导之前

感谢任何解决方案或提示!

从类ecdiffiehellmanng中提取共享密钥

你实际上不需要k,那么,你只需要计算H. ECDiffieHellman类允许你这样做。

byte[] prepend = Concat(V_C, V_S, I_C, I_S, K_S, Q_C, Q_S);
byte[] exchangeHash = ecdh.DeriveKeyFromHash(otherPublic, new HashAlgorithmName("whatever your hash algorithm is"), prepend, null);

虽然这是使用。net 4.6.2(目前在预览中)API: DeriveKeyFromHash

如果你在一个旧的框架上,它仍然是可能的,但需要使用ecdiffiehellmanng类型:

ecdhCng.SecretPrepend = prepend;
ecdhCng.SecretAppend = null;
ecdhCng.HashAlgorithm = new CngAlgorithm("whatever your hash algorithm is");
ecdhCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
byte[] exchangeHash = ecdhCng.DeriveKeyMaterial(otherPublic);

即使经过大量的研究,我也找不到一种方法来做到这一点,所以答案是否定的-你不能提取秘密。

我的解决方案是完全放弃ecdiffiehellmanng类,而是用c#包装OpenSSH库。

希望这至少能帮助到有同样想法的人。