【问题标题】:Extract the shared secret from class ECDiffieHellmanCng从 ECDiffieHellmanCng 类中提取共享密钥
【发布时间】:2016-06-29 16:13:15
【问题描述】:

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

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

但是,问题是我无法提取共享秘密而不派生它 (ECDiffieHellmanCng.DeriveKeyMaterial(CngKey otherpartyPublicKey))。

有没有办法直接访问共享密钥(在 RFC 文件中称为“k”)?

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

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

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

字符串 V_S,服务器的标识字符串(不包括 CR 和 LF)

字符串I_C,客户端SSH_MSG_KEXINIT的payload

字符串I_S,服务器SSH_MSG_KEXINIT的payload

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

string Q_C,客户端的临时公钥字节串

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

mpint K,共享秘密

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

【问题讨论】:

    标签: c# .net ssh elliptic-curve diffie-hellman


    【解决方案1】:

    您实际上并不需要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

    如果您使用的是较旧的框架,仍然可以,但需要专门使用 ECDiffieHellmanCng 类型:

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

    【讨论】:

    • 感谢您的回复。我试过了,但对我没有用。解决方案可能是 prepend 和 append 的某种组合,因为密钥有时需要多个派生才能生成具有预期长度的密钥。然而,微软关于它们的派生的文档是缺乏的,所以我没有费心去研究它。我会投票赞成答案,以便其他有此问题的人可以再试一次。 :)
    【解决方案2】:

    即使经过大量研究,我也找不到方法,所以答案是否定的 - 你无法提取秘密。

    我的全局解决方案是完全放弃 ECDiffieHellmanCng 类,而是将 OpenSSH 库包装在 C# 中。

    希望这至少可以帮助有相同想法的其他人。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2020-11-28
      • 2013-07-29
      • 2023-03-06
      • 2012-07-13
      相关资源
      最近更新 更多