椭圆曲线加密的.NET实现(库)

时间:2009-03-27 16:54:44

标签: .net encryption cryptography public-key-encryption elliptic-curve

请问您能否建议在.NET平台上使用椭圆曲线加密技术?

另外,如果你已经使用过它们,你能告诉我应该使用的推荐曲线吗?

[编辑]

正如@FatCat所提到的,它的实现在.NET framework 3.5中可用,但只能在windows vista上使用。你能否建议另一种方式/图书馆使用它?

5 个答案:

答案 0 :(得分:12)

.NET Framework已经包含了Diffie-Hellman,它是一种椭圆曲线加密算法。在System.Security.Cryptography.ECDiffieHellmanCng下查看。

答案 1 :(得分:8)

查看Bouncy Castle库中的C#,它有ECDH和ECDSA。

答案 2 :(得分:3)

您通常使用ECC进行加密的方法是使用“Ephemeral-Static Diffie-Hellman”。

它的工作原理如下:

  • 获取预期的接收者公钥(可能来自证书)。这是静态密钥。
  • 生成临时ECDH密钥对。这是短暂的密钥对。
  • 使用密钥生成共享对称密钥。
  • 使用对称密钥加密数据。
  • 将加密数据与短暂密钥对中的公钥一起传输。

接收方现在可以使用临时公钥和他自己的静态私钥来重新创建对称密钥并解密数据。

您可以在Standards for Efficient Cryptography: SEC 1: Elliptic Curve Cryptography第5.1.3节中阅读更多内容。

答案 3 :(得分:3)

查看SecureBlackBox组件

答案 4 :(得分:1)

  

大!我尝试过,但无法找到如何使用它来加密邮件。   似乎没有任何“加密”功能

这是System.Security.Cryptography.ECDiffieHellmanCng的MSDN示例。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;


class Alice
{
    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();
            }
        }
    }

}
public class Bob 
{
    public byte[] bobPublicKey;
    private byte[] bobKey;
    public Bob()
    {
        using (ECDiffieHellmanCng bob = new ECDiffieHellmanCng())
        {

            bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
            bob.HashAlgorithm = CngAlgorithm.Sha256;
            bobPublicKey = bob.PublicKey.ToByteArray();
            bobKey = bob.DeriveKeyMaterial(CngKey.Import(Alice.alicePublicKey, CngKeyBlobFormat.EccPublicBlob));

        }
    }

    public void Receive(byte[] encryptedMessage, byte[] iv)
    {

        using (Aes aes = new AesCryptoServiceProvider())
        {
            aes.Key = bobKey;
            aes.IV = iv;
            // Decrypt the message 
            using (MemoryStream plaintext = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(encryptedMessage, 0, encryptedMessage.Length);
                    cs.Close();
                    string message = Encoding.UTF8.GetString(plaintext.ToArray());
                    Console.WriteLine(message);
                }
            }
        }
    }

}