【问题标题】:.NET implementation (libraries) of elliptic curve cryptography椭圆曲线密码学的 .NET 实现(库)
【发布时间】:2010-10-15 23:44:54
【问题描述】:

您能否建议在 .NET 平台上使用椭圆曲线密码学的任何实现?

另外如果你用过的话,能不能告诉我推荐的应该用的曲线?

[编辑]

正如@FatCat 提到的,它的实现在 .NET 框架 3.5 中可用,但仅在 windows vista 上可用。您能否建议另一种使用方式/库?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 太棒了!我试过了,但找不到如何使用它来加密消息。似乎没有任何“加密”功能...框架 3.5 中新类的文档很烂。
    • 哦,现在我意识到这仅适用于 Windows Vista。
    • *Cng 后缀表示加密工作已卸载到 Windows CNG(下一代加密货币),适用于 Windows Vista 及更高版本。
    • Hemant:framework 3.5的文档还不错;你明白什么是 Diffie-Hellman 吗?它本身不用于加密,它用于派生一个秘密的共享密钥,以与使用公钥加密(包括 RSA 或 EC)的两方的对称密码一起使用。
    • @Hemant ECDH 是一个密钥交换系统,您可以使用它导出对称密钥以进行加密
    【解决方案2】:

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

    【讨论】:

    • 谢谢乔乔斯。我已经成功使用了 Bouncy Castle 库。不过,找到文档并不难! :)
    • c# 的最新版本是 1.7,2011 年 4 月 7 日,Java 1.51,2014 年 7 月 27 日。对于 c# 项目,我不喜欢 Bouncy Castle,因为缺少功能并且没有维护代码。
    • 请注意,C# 的 BouncyCastle 中的 ECC 非常慢,并且可能容易受到计时攻击。
    • @CodesInChaos 您在与 ECC 相关的不同问题上多次提到这一点。由于您似乎精通这一领域的密码学,您能否为 C# 推荐一个替代库?我正在寻找实现 DKG 协议,即用于构造密文的密钥是多方公钥的聚合? (远程受信任节点),而 ECC 似乎是其中不可或缺的要求。
    【解决方案3】:

    看看SecureBlackBox组件

    【讨论】:

      【解决方案4】:

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

      它是这样工作的:

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

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

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

      【讨论】:

      • 您提供的链接不再指向预期的文档。相反,它会将您带到 blackberry.certicom.com 页面。
      【解决方案5】:

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

      这是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);
                      }
                  }
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 2015-05-09
        • 1970-01-01
        • 2015-07-05
        • 2011-12-06
        • 2022-10-25
        相关资源
        最近更新 更多