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

椭圆曲线加密的.NET实现(库),.net,encryption,cryptography,public-key-encryption,elliptic-curve,.net,Encryption,Cryptography,Public Key Encryption,Elliptic Curve,你能建议在.NET平台上使用椭圆曲线加密的任何实现吗 此外,如果您已经使用了它们,您能告诉我应该使用的推荐曲线吗 [编辑] 正如@FatCat所提到的,其实现在.NET framework 3.5中可用,但仅在windows vista上可用。您能推荐另一种方法/库来使用它吗?该.NET Framework已经包括Diffie Hellman,这是一种椭圆曲线加密算法。看看下面 通常使用ECC进行加密的方法是使用“短暂的静态Diffie-Hellman” 它是这样工作的: 获取预期接收者的公钥

你能建议在.NET平台上使用椭圆曲线加密的任何实现吗

此外,如果您已经使用了它们,您能告诉我应该使用的推荐曲线吗

[编辑]


正如@FatCat所提到的,其实现在.NET framework 3.5中可用,但仅在windows vista上可用。您能推荐另一种方法/库来使用它吗?

该.NET Framework已经包括Diffie Hellman,这是一种椭圆曲线加密算法。看看下面

通常使用ECC进行加密的方法是使用“短暂的静态Diffie-Hellman”

它是这样工作的:

  • 获取预期接收者的公钥(可能来自证书)。这是静态键
  • 生成临时ECDH密钥对。这是短暂的钥匙对
  • 使用密钥生成共享对称密钥
  • 使用对称密钥加密数据
  • 将加密数据与临时密钥对中的公钥一起传输
接收者现在可以使用临时公钥和他自己的静态私钥来重新创建对称密钥并解密数据

您可以在第5.1.3节中阅读更多内容。

查看C#库,它有ECDH和ECDSA。

查看组件

太好了!我试过了,但找不到如何使用它来加密邮件。 似乎没有任何“加密”功能

这是的MSDN样本


伟大的我试过了,但找不到如何使用它来加密邮件。似乎没有任何“加密”功能…框架3.5中新类的文档很糟糕。哦,现在我意识到这只适用于Windows Vista。Cng后缀意味着加密工作被卸载到Windows Cng(crypto下一代)中,这在Windows Vista和更高版本中是有用的。赫曼特:框架3.5的文档还不错;你知道迪菲·赫尔曼是什么吗?它本身不用于加密,而是用于从使用公钥加密(包括RSA或EC)的双方获得一个用于对称密码的秘密共享密钥。@Hemant ECDH是一个密钥交换系统,您可以使用它来获得对称密钥进行加密感谢Chochos。我已经成功地使用了Bouncy Castle图书馆。不过,找到文档并不难!:)c#的最新版本是2011年4月7日的1.7版,Java 1.51的最新版本是2014年7月27日。对于c#项目,我不喜欢Bounchy Castle,因为缺少功能,也没有维护代码。请注意,c#的BounchyCastle中的ECC非常慢,可能容易受到定时攻击。@CodesInChaos您在与ECC相关的不同问题上多次提到过这一点。既然您似乎对这方面的密码学很在行,您能为C#推荐一个替代库吗?我希望实现一个DKG协议,即用于构造密文的密钥是多方公钥的集合??(远程受信任节点)和ECC似乎是这方面的一个整体要求。您提供的链接不再指向预期的文档。相反,它会将您带到blackberry.certicom.com页面。
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);
                }
            }
        }
    }

}