【发布时间】:2021-08-07 00:18:56
【问题描述】:
我想使用Diffie Hellman 算法在C++ 服务器和C# 客户端之间安全地交换密钥,这两个客户端都在Windows 上运行。我尝试在C# 中使用ECDiffieHellmanCng 生成公钥,如下所示:
ECDiffieHellmanCng diffieHellman = new ECDiffieHellmanCng
{
KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash,
HashAlgorithm = CngAlgorithm.Sha256
};
byte[] publicKey = diffieHellman.PublicKey.ToByteArray(); // 140 bytes
此外,我正在使用以下代码派生AES key:
var cngKey = CngKey.Import(publicKey, CngKeyBlobFormat.EccPublicBlob);
var aesKey = diffieHellman.DeriveKeyMaterial(cngKey); // 32 bytes
这在 C# 上下文中运行良好,但我需要它与 C++ 交互。
是否有任何与ECDiffieHellmanCng 兼容的C++ 库或代码?我查看了Crypto++but it wants me to generate a p, q, and g as well as the public key size being 128 bytes,它看起来与我的C# 密钥交换方法不兼容。
欢迎提供任何其他有关执行密钥交换的建议或代码示例。
【问题讨论】:
-
1) 您真的需要为每个客户端即时生成服务器密钥吗? 这对我来说不合适。客户端在连接时应该以某种方式信任服务器的公钥(要么有硬编码的 pub 密钥,要么使用第三方渠道来检查它),对吗? 2) 你不能只使用 TLS 并避免干预低级别的东西吗?
-
@MaximSagaydachny:我真的不需要,但我认为用
AES实现Diffie-Hellman就很容易了,显然不是。也许为服务器和客户端设置TLS更加可行和标准。我也会尝试这个,但由于不同的技术必须交互,它可能是另一种蠕虫。
标签: c# c++ windows diffie-hellman public-key-exchange