【问题标题】:What is a C++ library with an ECDiffieHellmanCng-compatible implementation?什么是具有 ECDiffieHellmanCng 兼容实现的 C++ 库?
【发布时间】:2011-01-09 04:02:17
【问题描述】:

我正在寻找 .NET 应用程序和嵌入式设备之间的密钥交换解决方案。这两个端点有一个共享的密钥,这使得椭圆曲线 Diffie-Hellman (ECDH) 算法非常适合安全地交换会话的主密钥。

有一个很好的C++库crypto++,它实现了ECDH,适用于嵌入式设备。但是,它的 ECDH 实现与 Mirosoft 的 ECDiffieHellmanCng 实现不同(正如其 FAQ 所暗示的那样)。我们希望与 .NET 安全算法保持兼容,以便我们可以坚持使用 PC 应用程序的托管代码(现在,或者如果我们使用 CNG,当我们有一天会放弃 XP 时)。

有没有人见过除 Microsoft 之外的与 Microsoft 兼容的实现?或者,在 .NET 代码和嵌入式 C++ 代码之间是否有其他好的密钥交换解决方案可与预共享密钥一起使用?

2010-01-27 更新:澄清一下,我正在尝试使用 ECDH 在两个互不信任的临时端点之间执行双向身份验证和密钥交换,直到他们看到它们共享同样的秘密。这类似于带外交换共享密钥的蓝牙配对场景(除了在我的情况下,设备可能彼此不靠近)。

【问题讨论】:

  • 您链接到的常见问题解答是 Peter Gutmann 的 cryptlib 的常见问题解答 - 不适用于 crypto++。
  • 很好的修正。最好通过常见问题解答条目作为一般警告,您不能仅仅假设同一个通用加密算法的两个实现可以相互工作。我希望有人碰巧知道是做什么的。

标签: c++ security cryptography shared-secret


【解决方案1】:

OpensSSL 有到 Visual Studio 的端口

【讨论】:

  • 我的第一选择是使用 .NET Framework 中已有的内容,这就是为什么我关注互操作性,而不仅仅是可移植性。
【解决方案2】:

为了实现互操作性,最好使用 RSA。由于专利雷区,您不会找到很多免费的 ECC 实现。

让一方生成一个随机密钥,用另一方的公钥对其进行加密,并用自己的私钥对其进行签名。然后对方可以验证签名并解密共享密钥。

如果您担心重放攻击(请注意,您计划使用的 ECDH 方案无法抵御这些攻击 - 除非您计划使用临时密钥),您可以让双方生成一个随机密钥,并使用对方的公钥,然后以某种方式组合这两个密钥。

使用一些标准协议可能会更好:考虑带有客户端证书验证的 TLS。您可以硬编码客户端和服务器证书。

【讨论】:

  • ECDH 方案通过为每个主密钥交换合并新的随机材料来防止重放攻击。在 .NET 中,ECDiffieHellmanCng 构造函数生成随机数。我喜欢您的 RSA 想法,但存在如何进行身份验证的问题(抱歉,我可能对此不够清楚)。双方都有一个共同的秘密,但都不相信对方不是冒名顶替者。我相信基于证书的身份验证是不切实际的,因为双方可能有数​​千个独特的实例,除了拥有共享的秘密之外,这些实例都是不受信任的。
【解决方案3】:

您引用的常见问题解答中没有任何内容以一种或另一种方式引用 CNG 实施。我认为常见问题解答中的陈述通常是正确的,尤其是专利情况。但是,有一些标准,特别是美国 NIST 已经发布了一些标准。参见例如Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2012-08-30
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多