【问题标题】:ECDiffieHellmanCng Implementation And MechanismECDiffieHellmanCng 实现和机制
【发布时间】: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


【解决方案1】:

你偶然发现的其实是微软开发的名为“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-Hellman 背后的相同基本思想。它最近引起了一些关注,因为它比经典变体要快得多,同时达到相同的安全级别。

【讨论】:

  • 谢谢你的回答,但我有一个问题,你提到的“它允许双方交换一个私钥,这样他们通信的被动窃听者就无法推断出交换的密钥。 "根据 MSDN 是真的。但是如果这个密钥应该在一个不安全的网络上交换,窃听者可以很容易地抓住交换的密钥,对吗?如果不是这样,ECDH 究竟是如何提供这种优势的?
  • @CMonster Diffie-Hellman 使用所谓的陷门函数。对于大素数p、基数1<g<p-1 和随机值0<a<p-1,很容易从pga 中计算出g^a mod p,但很难计算出a pgg^a mod p。这称为离散对数问题。因此,您可以发布g^a mod p,而不必担心有人计算a。您可以在 Wikipedia 页面上阅读有关内部工作原理的更多信息:en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多