我尝试弄清楚 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/