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



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



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



[EDIT]



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

926   5  

5 ответов:

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

Платформа .NET Framework уже включает в себя алгоритм Диффи-Хеллмана, представляющий собой криптоалгоритм эллиптической кривой. Посмотрите под системой.Безопасность.Криптография.ECDiffieHellmanCng .

Способ, которым вы обычно используете ECC для шифрования, заключается в использовании "эфемерно-статического Диффи-Хеллмана".

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

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

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

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

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

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

}

Comments

    Ничего не найдено.