ECDiffieHellmanCng Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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:
Alice e Bob criam um par de chaves a ser usado para a operação de troca de chaves Diffie-Hellman
Alice e Bob configuram o KDF usando parâmetros que concordam.
Alice envia a chave pública ao Bob.
Bob envia a alice sua chave pública.
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) |