.NET-реализация (библиотеки) криптографии на эллиптических кривых - PullRequest
16 голосов
/ 27 марта 2009

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

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

[EDIT]

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

Ответы [ 5 ]

12 голосов
/ 27 марта 2009

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

8 голосов
/ 13 апреля 2009

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

3 голосов
/ 16 апреля 2009

Взгляните на SecureBlackBox компоненты

3 голосов
/ 30 марта 2009

Обычно вы используете ECC для шифрования с помощью «Эфемерно-статического Диффи-Хеллмана».

Работает так:

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

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

Подробнее читайте в Стандарты эффективной криптографии: SEC 1: Криптография с эллиптическими кривыми , раздел 5.1.3.

1 голос
/ 20 января 2015

Отлично! Я попробовал это, но не могу найти, как использовать это, чтобы зашифровать сообщение. Кажется, не имеет никакой функции "Шифровать"

Это образец 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);
                }
            }
        }
    }

}
...