c# - 在有或没有下一代加密技术 (CNG) 的情况下使用 ECDiffieHellman

标签 c# cryptography

我尝试弄清楚 ECDiffieHellman 在 .Net 下是如何工作的。

我想知道,为什么 ECDiffieHellman 有两种看起来非常相似的实现。
Cng 代表下一代密码学 (CNG),它应该是更好的一个,还是不是?

为什么会出现这种二元论?使用哪一个?

System.Security.Cryptography.ECDiffieHellman.Create()

var alice = ECDiffieHellman.Create();
var bob = ECDiffieHellman.Create();

Assert.That(alice.PublicKey.ToXmlString(),
    Is.Not.EqualTo(bob.PublicKey.ToXmlString()));

var aliceSharedSecret = alice.DeriveKeyMaterial(bob.PublicKey);
var bobSharedSecret = bob.DeriveKeyMaterial(alice.PublicKey);

Assert.That(aliceSharedSecret, Is.EqualTo(bobSharedSecret));

新 System.Security.Cryptography.ECDiffieHellmanCng()

var alice = new ECDiffieHellmanCng();
var bob = new ECDiffieHellmanCng();

Assert.That(alice.PublicKey.ToXmlString(),
    Is.Not.EqualTo(bob.PublicKey.ToXmlString()));

var aliceSharedSecret = alice.DeriveKeyMaterial(bob.PublicKey);
var bobSharedSecret = bob.DeriveKeyMaterial(alice.PublicKey);

Assert.That(aliceSharedSecret, Is.EqualTo(bobSharedSecret));

最佳答案

ECDiffieHellman 是一个抽象基类,ECDiffieHellmanCng 是一个完整的实现类型,基于 Windows CNG。

ECDiffieHellman.Create() 默认情况下,返回 ECDiffieHellmanCng 实例。

不幸的是,DeriveKeyMaterial 方法需要额外的参数,这些参数在 ECDiffieHellmanCng 上作为属性公开。 .NET Framework 4.6.2 中已解决此问题,在 ECDiffieHellman 类上创建了多个仅使用参数(无属性)的 DeriveKey* 方法。

关于c# - 在有或没有下一代加密技术 (CNG) 的情况下使用 ECDiffieHellman,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303777/

相关文章:

c# - 如何使用 PostSharp 修改方法参数?

c# - 如何在 div.Innerhtml asp c# 中添加图像?

java - JSS SSLSocket 问题选择客户端证书

python - 如何使用 Python 的加密模块加载 RSA 公钥

c - 使用用户空间的 Linux 加密 API 进行 RSA

c# - WebView2 Source 属性不启动 CoreWebView2

c# - while 循环没有正确检查所有条件?

c# - 使用来自 VB6 代码的 C# 程序集。一些问题

.net - 使用 PKCS11 提供程序对文件进行加密签名并以 CMS 格式输出的最简单方法?

c# - System.Security.Cryptography.ProtectedData.Unprotect 在某些情况下抛出无效 key 错误