C# ECDiffieHellmancing的实现和机制

C# ECDiffieHellmancing的实现和机制,c#,encryption,cryptography,public-key-encryption,C#,Encryption,Cryptography,Public Key Encryption,我一直在阅读不同的密码算法,我偶然发现了“Diffie-Hellman下一代密码术”。我对这个算法做了很多搜索,发现它是一个非对称密码系统,在某些方面可以与RSA相媲美。我看了一下.Net的System.Security.Cryptography,发现它也提供了Diffie-Hellman加密。所以我不知道,在那里我找到了一个关于如何在C#中使用它的很好的例子,但是这个例子给我带来了一些问题。让我先复制部分代码:(我不发布完整的代码,因为我的问题主要是关于这部分的) 当我看到这一点时,我发现AE

我一直在阅读不同的密码算法,我偶然发现了“Diffie-Hellman下一代密码术”。我对这个算法做了很多搜索,发现它是一个非对称密码系统,在某些方面可以与RSA相媲美。我看了一下.Net的
System.Security.Cryptography
,发现它也提供了Diffie-Hellman加密。所以我不知道,在那里我找到了一个关于如何在C#中使用它的很好的例子,但是这个例子给我带来了一些问题。让我先复制部分代码:(我不发布完整的代码,因为我的问题主要是关于这部分的)

当我看到这一点时,我发现AES做了所有的事情,
ECDiffieHellman
只负责为AES算法提供一个密钥。同时,它本身基于SHA256哈希系统


所以我的问题是,在这种情况下,这个“ecdiffiehellmancing”到底在做什么?我看到的是一个混合加密系统,一个用于密钥交换,另一个用于加密,这与我在互联网上读到的关于Diffie-Hellman算法的内容相冲突,大多数来源都将其列在非对称加密系统下,但这个示例没有显示相同的内容。我这样说是因为当我看
AliceKey
时,我看到它是基于一个公钥生成的,这个公钥可能是使用SHA256生成的,它本身并没有加密/解密任何东西

您偶然发现的实际上是由Microsoft开发的名为“”的“加密开发平台”。从密码学的角度来看,这里没有什么革命性的或“下一代”,只有一个实现或包装已知加密算法的新库

是最古老、最受尊敬的算法之一。它允许双方以这样的方式交换私钥,即被动窃听者无法推断交换的密钥。因此,Diffie-Hellman是许多密码协议的重要组成部分。但它不是一种加密算法。在双方推导出私钥后,他们仍然必须使用对称算法对后续通信进行加密

这并不是Diffie Hellman所独有的,每个非对称算法都与许多对称算法一起使用,以构建一个工作且安全的协议。例如,RSA只允许使用2048bit密钥一次加密256字节。出于安全目的,您不应该使用原始RSA加密数据。我已经描述了一种使用RSA安全地加密任意数据的组合


椭圆曲线Diffie-Hellman是经典Diffie Hellman的一个变种,它使用了另一个数学结构——AN作为一个基础,连同Diffie Hellman背后的基本思想。最近,它获得了一些关注,因为它在实现相同安全级别的同时,比经典变体快得多。

Diffie–Hellman是一种密钥交换算法。它发表于1976年(参见1977年的RSA),所以我不确定“下一代”在这里如何适用。然而,您的代码似乎使用的是椭圆曲线Diffie–Hellman,这是另一种有点相关的算法。谢谢您的回答,但我有一个问题,您提到的“它允许双方以这样一种方式交换私钥,即被动窃听者无法推断交换的密钥。”根据MSDN,这是正确的。但是如果这个密钥应该在一个不安全的网络上交换,窃听者可以很容易地捕获交换的密钥,对吗?如果不是这样,ECDH究竟是如何提供这种优势的?@CMonster Diffie-Hellman使用了一种所谓的陷门函数。对于大素数
p
,基
1
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();
        }
    }
}

}