我试图弄清楚ECDiffieHellman是如何在.Net下工作的。
我想知道,为什么有两种ECDiffieHellman的实现似乎很相似
Cng
代表下一代密码学(CNG),它应该是更好的,或不是?
为什么会出现这种二元论?哪一个使用?
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));
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));
答案 0 :(得分:2)
ECDiffieHellman
是一个抽象基类,ECDiffieHellmanCng
是一个完整的实现类型,基于Windows CNG。
ECDiffieHellman.Create()
会返回一个ECDiffieHellmanCng实例。
遗憾的是,DeriveKeyMaterial方法采用了额外的参数,这些参数在ECDiffieHellmanCng上作为属性公开。这在.NET Framework 4.6.2中得到了解决,在ECDiffieHellman类上创建了几个仅使用参数的DeriveKey *方法(没有属性)。