使用ECDiffieHellman,无论是否有下一代加密(CNG)

时间:2016-12-23 15:09:09

标签: 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));

new 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));

1 个答案:

答案 0 :(得分:2)

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

默认情况下,

ECDiffieHellman.Create()会返回一个ECDiffieHellmanCng实例。

遗憾的是,DeriveKeyMaterial方法采用了额外的参数,这些参数在ECDiffieHellmanCng上作为属性公开。这在.NET Framework 4.6.2中得到了解决,在ECDiffieHellman类上创建了几个仅使用参数的DeriveKey *方法(没有属性)。