ECDiffieHellmanCng Classe

Definição

Fornece uma implementação de Criptografia de Nova Geração (CNG) do algoritmo Elliptic Curve Diffie-Hellman (ECDH). Esta classe é usada para realizar operações criptográficas.

public ref class ECDiffieHellmanCng sealed : System::Security::Cryptography::ECDiffieHellman
public sealed class ECDiffieHellmanCng : System.Security.Cryptography.ECDiffieHellman
type ECDiffieHellmanCng = class
    inherit ECDiffieHellman
Public NotInheritable Class ECDiffieHellmanCng
Inherits ECDiffieHellman
Herança

Exemplos

O exemplo seguinte mostra como usar a ECDiffieHellmanCng classe para estabelecer uma troca de chaves e como usar essa chave para encriptar uma mensagem que pode ser enviada por um canal público e desencriptada pelo recetor.

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 bobKey = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob);
            byte[] aliceKey = alice.DeriveKeyMaterial(bobKey);
            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);
                }
            }
        }
    }
}
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text




Class Alice
    Public Shared alicePublicKey() As Byte


    Public Shared Sub Main(ByVal args() As String)
        Using alice As New ECDiffieHellmanCng()
            alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash
            alice.HashAlgorithm = CngAlgorithm.Sha256
            alicePublicKey = alice.PublicKey.ToByteArray()
            Dim bob As New Bob()
            Dim k As CngKey = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob)
            Dim aliceKey As Byte() = alice.DeriveKeyMaterial(CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob))
            Dim encryptedMessage As Byte() = Nothing
            Dim iv As Byte() = Nothing
            Send(aliceKey, "Secret message", encryptedMessage, iv)
            bob.Receive(encryptedMessage, iv)
        End Using
    End Sub


    Private Shared Sub Send(ByVal key() As Byte, ByVal secretMessage As String, ByRef encryptedMessage() As Byte, ByRef iv() As Byte)
        Using aes As New AesCryptoServiceProvider()
            aes.Key = key
            iv = aes.IV

            ' Encrypt the message
            Using ciphertext As New MemoryStream()
                Using cs As New CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write)
                    Dim plaintextMessage As Byte() = Encoding.UTF8.GetBytes(secretMessage)
                    cs.Write(plaintextMessage, 0, plaintextMessage.Length)
                    cs.Close()
                    encryptedMessage = ciphertext.ToArray()
                End Using
            End Using
        End Using

    End Sub
End Class

Public Class Bob
    Public bobPublicKey() As Byte
    Private bobKey() As Byte

    Public Sub New()
        Using bob As New ECDiffieHellmanCng()

            bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash
            bob.HashAlgorithm = CngAlgorithm.Sha256
            bobPublicKey = bob.PublicKey.ToByteArray()
            bobKey = bob.DeriveKeyMaterial(CngKey.Import(Alice.alicePublicKey, CngKeyBlobFormat.EccPublicBlob))
        End Using

    End Sub


    Public Sub Receive(ByVal encryptedMessage() As Byte, ByVal iv() As Byte)

        Using aes As New AesCryptoServiceProvider()
                aes.Key = bobKey
                aes.IV = iv
                ' Decrypt the message
            Using plaintext As New MemoryStream()
                Using cs As New CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write)
                    cs.Write(encryptedMessage, 0, encryptedMessage.Length)
                    cs.Close()
                    Dim message As String = Encoding.UTF8.GetString(plaintext.ToArray())
                    Console.WriteLine(message)
                End Using
            End Using
        End Using
    End Sub
End Class

Observações

A ECDiffieHellmanCng classe permite que duas partes troquem material de chave privada mesmo que estejam a comunicar através de um canal público. Ambas as partes podem calcular o mesmo valor secreto, que é referido como o acordo secreto nas classes de Diffie-Hellman geridas. O acordo secreto pode então ser usado para vários fins, incluindo como uma chave simétrica. No entanto, em vez de expor diretamente o acordo secreto, a ECDiffieHellmanCng classe faz algum pós-processamento do acordo antes de fornecer o valor. Este pós-processamento é referido como função de derivação de chaves (KDF); podes selecionar qual KDF queres usar e definir os seus parâmetros através de um conjunto de propriedades na instância do objeto Diffie-Hellman.

Função de derivação de chaves Properties
Hash HashAlgorithm - O algoritmo de hash utilizado para processar o acordo secreto.

SecretPrepend - Um array de bytes opcional para anteceder ao acordo secreto antes de o hashar.

SecretAppend - Um array opcional de bytes para anexar ao acordo secreto antes de o fazer por hash.
Hmac HashAlgorithm - O algoritmo de hash utilizado para processar o acordo secreto.

SecretPrepend- Um array de bytes opcional para anteceder ao acordo secreto antes de o hashar.

SecretAppend - Um array opcional de bytes para anexar ao acordo secreto antes de o fazer por hash.
Tls Label - O rótulo para a derivação de chaves.

Seed - A semente para a derivação de chaves.

O resultado de passar o acordo secreto através da função de derivação de chaves é um array de bytes que pode ser usado como material chave para a sua aplicação. O número de bytes de material chave gerado depende da função de derivação de chaves; por exemplo, o SHA-256 gera 256 bits de material chave, enquanto o SHA-512 gera 512 bits de material-chave. O fluxo básico de uma troca de chaves ECDH é o seguinte:

  1. Alice e Bob criam um par de chaves para usar na operação de troca de chaves Diffie-Hellman

  2. Alice e Bob configuram o KDF usando parâmetros que concordam.

  3. Alice envia a sua chave pública ao Bob.

  4. Bob envia a Alice a sua chave pública.

  5. Alice e Bob usam as chaves públicas um do outro para gerar o acordo secreto e aplicam a KDF ao acordo secreto para gerar material chave.

Construtores

Name Description
ECDiffieHellmanCng()

Inicializa uma nova instância da ECDiffieHellmanCng classe com um par de chaves aleatórias.

ECDiffieHellmanCng(CngKey)

Inicializa uma nova instância da ECDiffieHellmanCng classe usando o objeto especificado CngKey .

ECDiffieHellmanCng(ECCurve)

Cria uma nova instância da ECDiffieHellmanCng classe cujo par de chaves pública/privada é gerado ao longo da curva especificada.

ECDiffieHellmanCng(Int32)

Inicializa uma nova instância da ECDiffieHellmanCng classe com um par de chaves aleatórias, usando o tamanho da chave especificado.

Campos

Name Description
KeySizeValue

Representa o tamanho, em bits, do módulo de chave usado pelo algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)
LegalKeySizesValue

Especifica os tamanhos de chave suportados pelo algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)

Propriedades

Name Description
HashAlgorithm

Obtém ou define o algoritmo de hash para usar ao gerar material chave.

HmacKey

Obtém ou define a chave Hash-based Message Authentication Code (HMAC) para usar ao derivar material de chave.

Key

Especifica o CngKey que é usado pelo objeto atual para operações criptográficas.

KeyDerivationFunction

Obtém ou define a função de derivação chave para a ECDiffieHellmanCng classe.

KeyExchangeAlgorithm

Obtém o nome do algoritmo de troca de chaves.

(Herdado de ECDiffieHellman)
KeySize

Obtém ou define o tamanho, em bits, do módulo de chave usado pelo algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)
Label

Obtém ou define o valor da etiqueta que é usado para a derivação de chaves.

LegalKeySizes

Obtém os tamanhos de chave suportados pelo algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)
PublicKey

Obtém a chave pública que pode ser usada por outro ECDiffieHellmanCng objeto para gerar um acordo secreto partilhado.

SecretAppend

Obtém ou define um valor que será acrescentado ao acordo secreto ao gerar material-chave.

SecretPrepend

Obtém ou define um valor que será adicionado ao início do acordo secreto ao derivar material-chave.

Seed

Obtém ou define o valor semente que será usado ao derivar o material-chave.

SignatureAlgorithm

Recebe o nome do algoritmo de assinatura.

(Herdado de ECDiffieHellman)
UseSecretAgreementAsHmacKey

Obtém um valor que indica se o acordo secreto é usado como uma chave de Código de Autenticação de Mensagens Baseada em Hash (HMAC) para obter material de chave.

Métodos

Name Description
Clear()

Liberta todos os recursos usados pela AsymmetricAlgorithm turma.

(Herdado de AsymmetricAlgorithm)
DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[])

Realiza a derivação de chaves usando um algoritmo de hash especificado com dados opcionais prependidos ou acrescentados.

DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName)

Realiza a derivação de chaves usando um algoritmo de hash especificado.

(Herdado de ECDiffieHellman)
DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[], Byte[])

Realiza a derivação de chaves usando um algoritmo HMAC (Hash-based Message Authentication Code) especificado com dados opcionais prependidos ou acrescentados.

DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[])

Realiza a derivação de chaves usando um algoritmo HMAC (Código de Autenticação de Mensagens Baseado em Hash) especificado.

(Herdado de ECDiffieHellman)
DeriveKeyMaterial(CngKey)

Deriva o material da chave gerado a partir do acordo secreto entre duas partes, dado um CngKey objeto que contém a chave pública da segunda parte.

DeriveKeyMaterial(ECDiffieHellmanPublicKey)

Deriva o material da chave gerado a partir do acordo secreto entre duas partes, dado um ECDiffieHellmanPublicKey objeto que contém a chave pública da segunda parte.

DeriveKeyTls(ECDiffieHellmanPublicKey, Byte[], Byte[])

Realiza a derivação de chaves usando a função TLS (Transport Layer Security) 1.1 PRF (FunçãoPseudo-Random).

DeriveSecretAgreementHandle(CngKey)

Obtém um controlo do acordo secreto gerado entre duas partes, dado um CngKey objeto que contém a chave pública da segunda parte.

DeriveSecretAgreementHandle(ECDiffieHellmanPublicKey)

Obtém um acesso ao acordo secreto gerado entre duas partes, dado um ECDiffieHellmanPublicKey objeto que contém a chave pública da segunda parte.

Dispose()

Liberta todos os recursos usados pela instância atual da AsymmetricAlgorithm classe.

(Herdado de AsymmetricAlgorithm)
Dispose(Boolean)

Liberta os recursos não geridos usados pela AsymmetricAlgorithm classe e, opcionalmente, liberta os recursos geridos.

(Herdado de AsymmetricAlgorithm)
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
ExportExplicitParameters(Boolean)

Exporta os parâmetros chave e da curva explícita usados pelo ECCurve objeto para um ECParameters objeto.

ExportParameters(Boolean)

Exporta a chave usada pelo ECCurve objeto para um ECParameters objeto.

FromXmlString(String, ECKeyXmlFormat)

Desserializa a informação chave de uma cadeia XML usando o formato especificado.

FromXmlString(String)

Este método não é implementado.

GenerateKey(ECCurve)

Gera um novo par de chaves pública/privada efémera para a curva especificada.

GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
ImportParameters(ECParameters)

Importa os parâmetros especificados para um ECCurve objeto como chave para a instância atual.

MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
ToXmlString(Boolean)

Este método não é implementado.

ToXmlString(ECKeyXmlFormat)

Serializa a informação chave para uma string XML usando o formato especificado.

Implementações de Interface Explícita

Name Description
IDisposable.Dispose()

Esta API suporta a infraestrutura de produtos e não é pressuposta para ser utilizada diretamente a partir do seu código.

Para uma descrição deste elemento, veja Dispose().

(Herdado de AsymmetricAlgorithm)

Aplica-se a