Подтвердить что ты не робот

Реализация .NET(библиотеки) криптографии с эллиптической кривой

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

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

[EDIT]

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

4b9b3361

Ответ 1

Ознакомьтесь с библиотекой Bouncy Castle для С#, она имеет ECDH и ECDSA.

Ответ 2

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

Ответ 3

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

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

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

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

Вы можете прочитать больше в " Стандартах для эффективной криптографии": SEC 1: Эллиптическая кривая криптографии, раздел 5.1.3.

Ответ 5

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

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

}