从类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,共享秘密<——这就是为什么我需要纯秘密在任何推导之前
感谢任何解决方案或提示!
你实际上不需要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库。
希望这至少能帮助到有同样想法的人。