ECDiffieHellmanCng Classe

Definição

Fornece uma implementação de CNG (Cryptography Next Generation) do algoritmo ECDH (Diffie-Hellman de Curva Elíptica). Essa classe é usada para executar 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 a seguir mostra como usar a ECDiffieHellmanCng classe para estabelecer uma troca de chaves e como usar essa chave para criptografar uma mensagem que pode ser enviada por um canal público e descriptografada pelo receptor.

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

Comentários

A ECDiffieHellmanCng classe permite que duas partes troquem material de chave privada mesmo se estiverem se comunicando por meio de um canal público. Ambas as partes podem calcular o mesmo valor secreto, que é conhecido como o contrato secreto nas classes de Diffie-Hellman gerenciadas. O contrato secreto pode então ser usado para uma variedade de finalidades, incluindo como uma chave simétrica. No entanto, em vez de expor diretamente o contrato secreto, a ECDiffieHellmanCng classe faz alguns pós-processamento no contrato antes de fornecer o valor. Esse pós-processamento é chamado de função de derivação de chave (KDF); você pode selecionar qual KDF deseja usar e definir seus parâmetros por meio de um conjunto de propriedades na instância do objeto Diffie-Hellman.

Função de derivação de chave Propriedades
Hash HashAlgorithm - O algoritmo de hash usado para processar o contrato secreto.

SecretPrepend - Uma matriz de bytes opcional para anexar ao contrato secreto antes de hash-lo.

SecretAppend - Uma matriz de bytes opcional a ser acrescentada ao contrato secreto antes de hash-lo.
Hmac HashAlgorithm - O algoritmo de hash usado para processar o contrato secreto.

SecretPrepend- Uma matriz de bytes opcional para anexar ao contrato secreto antes de hash-lo.

SecretAppend - Uma matriz de bytes opcional a ser acrescentada ao contrato secreto antes de hash-lo.
Tls Label - O rótulo da derivação de chave.

Seed - A semente para derivação de chave.

O resultado da passagem do contrato secreto por meio da função de derivação de chave é uma matriz de bytes que pode ser usada como material de chave para seu aplicativo. O número de bytes de material de chave gerado depende da função de derivação de chave; por exemplo, SHA-256 gerará 256 bits de material de chave, enquanto SHA-512 gerará 512 bits de material de chave. O fluxo básico de uma troca de chaves ECDH é o seguinte:

  1. Alice e Bob criam um par de chaves a ser usado para a operação de troca de chaves Diffie-Hellman

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

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

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

  5. Alice e Bob usam as chaves públicas umas das outras para gerar o contrato secreto e aplicar o KDF ao contrato secreto para gerar material de chave.

Construtores

Nome 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 na curva especificada.

ECDiffieHellmanCng(Int32)

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

Campos

Nome 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 compatíveis com o algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)

Propriedades

Nome Description
HashAlgorithm

Obtém ou define o algoritmo de hash a ser usado ao gerar material de chave.

HmacKey

Obtém ou define a chave HMAC (Código de Autenticação de Mensagem) baseada em Hash a ser usada ao derivar o material da 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 de 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 do rótulo usado para derivação de chave.

LegalKeySizes

Obtém os tamanhos de chave compatíveis com o algoritmo assimétrico.

(Herdado de AsymmetricAlgorithm)
PublicKey

Obtém a chave pública que pode ser usada por outro ECDiffieHellmanCng objeto para gerar um contrato de segredo compartilhado.

SecretAppend

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

SecretPrepend

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

Seed

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

SignatureAlgorithm

Obtém o nome do algoritmo de assinatura.

(Herdado de ECDiffieHellman)
UseSecretAgreementAsHmacKey

Obtém um valor que indica se o contrato secreto é usado como uma chave HMAC (Código de Autenticação de Mensagem) baseada em Hash para derivar material de chave.

Métodos

Nome Description
Clear()

Libera todos os recursos usados pela AsymmetricAlgorithm classe.

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

Executa a derivação de chave usando um algoritmo de hash especificado com dados pré-anexados ou acrescentados opcionais.

DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName)

Executa a derivação de chave usando um algoritmo de hash especificado.

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

Executa a derivação de chave usando um algoritmo HMAC (Código de Autenticação de Mensagem baseado em Hash) especificado com dados pré-anexados ou acrescentados opcionais.

DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[])

Executa a derivação de chave usando um algoritmo HMAC (Código de Autenticação de Mensagem baseado em Hash) especificado.

(Herdado de ECDiffieHellman)
DeriveKeyMaterial(CngKey)

Deriva o material-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 de chave que é 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[])

Executa a derivação de chave usando a PRF do TLS (Transport Layer Security) 1.1 ( funçãoPseudo-Random).

DeriveSecretAgreementHandle(CngKey)

Obtém um identificador para o contrato secreto gerado entre duas partes, dado um CngKey objeto que contém a chave pública da segunda parte.

DeriveSecretAgreementHandle(ECDiffieHellmanPublicKey)

Obtém um identificador para o contrato secreto gerado entre duas partes, dado um ECDiffieHellmanPublicKey objeto que contém a chave pública da segunda parte.

Dispose()

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

(Herdado de AsymmetricAlgorithm)
Dispose(Boolean)

Libera os recursos não gerenciados usados pela AsymmetricAlgorithm classe e, opcionalmente, libera os recursos gerenciados.

(Herdado de AsymmetricAlgorithm)
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
ExportExplicitParameters(Boolean)

Exporta a chave e os parâmetros de curva explícitos usados pelo ECCurve objeto em um ECParameters objeto.

ExportParameters(Boolean)

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

FromXmlString(String, ECKeyXmlFormat)

Desserializa as informações de chave de uma cadeia de caracteres XML usando o formato especificado.

FromXmlString(String)

Esse 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 a função 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 uma chave para a instância atual.

MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)
ToXmlString(Boolean)

Esse método não é implementado.

ToXmlString(ECKeyXmlFormat)

Serializa as informações de chave para uma cadeia de caracteres XML usando o formato especificado.

Implantações explícitas de interface

Nome Description
IDisposable.Dispose()

Esta API dá suporte à infraestrutura do produto e não deve ser usada diretamente do seu código.

Para obter uma descrição deste membro, consulte Dispose().

(Herdado de AsymmetricAlgorithm)

Aplica-se a