16

Пожалуйста, вы можете предложить любой реализации эллиптической кривой криптографии для использования на платформе .NET?реализация .NET (библиотеки) на эллиптической кривой криптографии

Также, если вы использовали их, можете ли вы рассказать мне рекомендуемые кривые, которые следует использовать?

[EDIT]

Как уже упоминалось @FatCat, его реализация доступна в рамках .NET 3.5, но это доступно только на Windows Vista. Можете ли вы предложить другой способ/библиотеку, чтобы использовать его?

ответ

9

Проверьте библиотеку Bouncy Castle на C#, у нее есть ECDH и ECDSA.

+0

Спасибо Chochos. Я успешно использовал библиотеку Bouncy Castle. Однако было трудно найти документацию! :) – Hemant

+0

Последняя версия для C# - 1.7, 7 апреля 2011 года, для Java 1.51, 27 июля 2014 года. Для проектов C# я не предпочитаю Bouncy Castle из-за недостающих функций и не поддерживаемого кода. –

+0

Обратите внимание, что ECC в BouncyCastle для C# очень медленный и, вероятно, уязвим для временных атак. – CodesInChaos

11

В .NET Framework уже включен Diffie-Hellman, который является криптографическим алгоритмом эллиптической кривой. Посмотрите под System.Security.Cryptography.ECDiffieHellmanCng.

+0

Отлично! Я попробовал, но не могу найти, как использовать его для шифрования сообщения. Кажется, не имеет никакой функции «Шифровать» ... Документация новых классов в рамках 3.5 отстой. – Hemant

+0

Ой, и теперь я понимаю, что это будет работать только в Windows Vista. – Hemant

+1

* Суффикс Cng означает, что криптографическая работа выгружается в Windows CNG (Crypto Next Gen), которая доступна в Windows Vista и более поздних версиях. –

3

Как вы обычно используете ECC для шифрования, используется «Ephemeral-Static Diffie-Hellman».

Он работает следующим образом:

  • Возьмите открытый ключ, предназначенные приемниками (возможно, с сертификатом). Это статический ключ.
  • Создайте временную пару ключей ECDH. Это эфемерная ключевая пара.
  • Используйте ключи для создания общего симметричного ключа.
  • Шифровать данные с помощью симметричного ключа.
  • передачи зашифрованных данных с помощью открытого ключа из эфемерных паров ключей.

Получатель теперь может использовать эфемерный открытый ключ и свой собственный статический закрытый ключ для воссоздания симметричного ключа и дешифрования данных.

Дополнительную информацию вы можете найти в разделе Standards for Efficient Cryptography: SEC 1: Elliptic Curve Cryptography, раздел 5.1.3.

0

Отлично! Я попробовал, но не могу найти, как использовать его для шифрования сообщения. Не похоже, чтобы иметь какую-либо функцию «шифровать»

Это образец MSDN для System.Security.Cryptography.ECDiffieHellmanCng.

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

}