Pergunta

Por favor, você pode sugerir qualquer implementação de Criptografia de Curva Elíptica para ser usado na plataforma .NET?

Além disso, se você utilizá-los, você pode me dizer as curvas recomendadas que devem ser usados?

[EDIT]

Como @FatCat mencionado, a sua aplicação está disponível em .NET Framework 3.5, mas que só está disponível no Windows Vista. Você pode por favor sugerir uma outra maneira / biblioteca para usá-lo?

Foi útil?

Solução

Confira biblioteca Bouncy Castle para C #, tem ECDH e ECDSA.

Outras dicas

O .NET Framework já inclui Diffie-Hellman, que é um algoritmo de curva elíptica cripto. Olhar sob System.Security.Cryptography.ECDiffieHellmanCng .

Tenha um olhar em SecureBlackbox componentes

A maneira como você costuma usar ECC para criptografia é usando "Efémero-Static Diffie-Hellman".

Ele funciona da seguinte maneira:

  • Tome a chave pública receptores destinados (talvez de um certificado). Esta é a chave estática.
  • Gerar um par de chaves ECDH temporária. Este é o par de chaves efêmero.
  • Use as teclas para gerar uma chave simétrica compartilhada.
  • criptografar os dados com a chave simétrica.
  • transmitir os dados criptografados, juntamente com a chave pública do par de chaves efêmera.

O receptor pode agora usar a chave pública efêmero e sua chave privada própria estática para recriar a chave simétrica e descriptografar os dados.

Você pode ler mais na Padrões de criptografia eficiente: Seção 1: Elliptic Curve Cryptography seção 5.1.3.

Great! Eu tentei, mas não consigo encontrar como usá-lo para criptografar uma mensagem. não parecem ter qualquer função "Criptografar"

Esta amostra MSDN para 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);
                }
            }
        }
    }

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top