【发布时间】:2014-04-23 11:15:28
【问题描述】:
我一直在阅读不同的加密算法,并且遇到了“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 制作的公钥制作的,它本身并没有加密/解密任何东西。
【问题讨论】:
-
Diffie-Hellman 是一种密钥交换算法。它于 1976 年出版(参见 1977 年的 RSA),所以我不确定“下一代”如何适用于此。但是,您的代码似乎使用的是椭圆曲线 Diffie–Hellman,这是另一种有点相关的算法。
标签: c# encryption cryptography public-key-encryption