我一直在阅读不同的加密算法,我遇到了#34; Diffie Hellman Cryptography Next Generation"。我已经对这个算法做了很多搜索,我发现它是一个非对称加密系统,它在某些方面可以与RSA相媲美。我查看了.Net的System.Security.Cryptography
,我发现它也提供了Diffie-Hellman密码术。所以我想到MSDN并在那里找到了一个关于如何在C#中使用它的非常好的例子,但是这个例子给我带来了一些问题。让我先复制一部分代码:(我不会发布完整的代码,因为我的问题主要是关于这部分)
public static byte[] alicePublicKey;
public static void Main(string[] args)
{
using (ECDiffieHellmanCng alice = new ECDiffieHellmanCng())
{
alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
alice.HashAlgorithm = CngAlgorithm.Sha256;
alicePublicKey = alice.PublicKey.ToByteArray();
Bob bob = new Bob();
CngKey k = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob);
byte[] aliceKey = alice.DeriveKeyMaterial(CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob));
byte[] encryptedMessage = null;
byte[] iv = null;
Send(aliceKey, "Secret message", out encryptedMessage, out iv);
bob.Receive(encryptedMessage, iv);
}
}
private static void Send(byte[] key, string secretMessage, out byte[] encryptedMessage, out byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = key;
iv = aes.IV;
// Encrypt the message
using (MemoryStream ciphertext = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] plaintextMessage = Encoding.UTF8.GetBytes(secretMessage);
cs.Write(plaintextMessage, 0, plaintextMessage.Length);
cs.Close();
encryptedMessage = ciphertext.ToArray();
}
}
}
}
当我看到这一点时,我发现正在执行所有操作的是AES,而ECDiffieHellman
仅负责为AES算法提供密钥。同时它本身基于SHA256散列系统。
所以我的问题是,这究竟是什么" ECDiffieHellmanCng"在这种情况下呢?我看到的是一个混合密码系统,一个用于密钥交换,另一个用于加密,这与我在互联网上阅读的关于这个Diffie Hellman算法的内容有冲突,大多数消息来源都列在非对称加密系统下但是这个例子没有表现出同样的事情。我这样说是因为当我看到AliceKey
我看到它时,它是基于一个可能使用SHA256制作的公钥而制作的,它本身并不加密/解密任何东西。
答案 0 :(得分:4)
你偶然发现的是微软开发的名为“Cryptography Next Generation”的“加密开发平台”。从加密的角度来看,那里没有任何革命性或“下一代”,只是一个实现或包装已知加密算法的新库。
Diffie-Hellman是我们可用的最古老,最受尊敬的asymmetric cryptographic算法之一。它允许双方以这样的方式交换私钥,使得其通信的被动窃听者不能推断交换的密钥。因此,Diffie-Hellman是许多加密协议的重要构建块。但它不是加密算法。在双方推断出私钥之后,他们仍然必须使用对称算法来加密他们的后续通信。
但这并不是Diffie-Hellman独有的,每个非对称算法都与许多对称算法一起使用,以构建一个有效且安全的协议。例如,RSA仅允许您使用2048位密钥一次加密256个字节。出于安全考虑,您绝不应使用原始RSA来加密数据。我已经描述了一种组合,可以安全地使用RSA来加密this answer中的任意数据。
椭圆曲线Diffie-Hellman 是经典Diffie-Hellman的变体,它使用其他数学结构 - elliptic curve - 作为基础以及Diffie背后的相同基本思想 - 赫尔曼。它最近获得了一些关注,因为它比经典版本快得多,同时达到了相同的安全级别。