ECDiffieHellmanCng Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit une implémentation CNG (Cryptography Next Generation) de l’algorithme ECDH (Elliptic Curve Diffie-Hellman). Cette classe est utilisée pour effectuer des opérations de chiffrement.
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
- Héritage
Exemples
L’exemple suivant montre comment utiliser la ECDiffieHellmanCng classe pour établir un échange de clés et comment utiliser cette clé pour chiffrer un message qui peut être envoyé via un canal public et déchiffré par le récepteur.
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
Remarques
La ECDiffieHellmanCng classe permet à deux parties d’échanger des documents de clé privée même s’ils communiquent via un canal public. Les deux parties peuvent calculer la même valeur secrète, appelée contrat secret dans les classes de Diffie-Hellman managées. L’accord secret peut ensuite être utilisé à diverses fins, notamment en tant que clé symétrique. Toutefois, au lieu d’exposer directement le contrat secret, la ECDiffieHellmanCng classe effectue un post-traitement sur le contrat avant de fournir la valeur. Ce post-traitement est appelé fonction de dérivation de clé (KDF) ; vous pouvez sélectionner la fonction KDF que vous souhaitez utiliser et définir ses paramètres via un ensemble de propriétés sur l’instance de l’objet Diffie-Hellman.
| Fonction de dérivation de clé | Properties |
|---|---|
| Hash |
HashAlgorithm - Algorithme de hachage utilisé pour traiter le contrat secret. SecretPrepend - Tableau d’octets facultatif à ajouter au contrat secret avant de le hacher. SecretAppend - Tableau d’octets facultatif à ajouter au contrat secret avant de le hacher. |
| Hmac |
HashAlgorithm - Algorithme de hachage utilisé pour traiter le contrat secret. SecretPrepend- Tableau d’octets facultatif à ajouter au contrat secret avant de le hacher. SecretAppend - Tableau d’octets facultatif à ajouter au contrat secret avant de le hacher. |
| Tls |
Label - Étiquette de dérivation de clé. Seed - Valeur initiale pour la dérivation de clé. |
Le résultat de la transmission du contrat secret par le biais de la fonction de dérivation de clé est un tableau d’octets qui peut être utilisé comme matériau de clé pour votre application. Le nombre d’octets de matériel de clé généré dépend de la fonction de dérivation de clé ; par exemple, SHA-256 génère 256 bits de matériel clé, tandis que SHA-512 génère 512 bits de matériel clé. Le flux de base d’un échange de clés ECDH est le suivant :
Alice et Bob créent une paire de clés à utiliser pour l’opération d’échange de clés Diffie-Hellman
Alice et Bob configurent le KDF à l’aide des paramètres sur utilisant l’accord.
Alice envoie Bob sa clé publique.
Bob envoie à Alice sa clé publique.
Alice et Bob utilisent les clés publiques des uns des autres pour générer le contrat secret et appliquer la KDF au contrat secret pour générer des éléments clés.
Constructeurs
| Nom | Description |
|---|---|
| ECDiffieHellmanCng() |
Initialise une nouvelle instance de la ECDiffieHellmanCng classe avec une paire de clés aléatoire. |
| ECDiffieHellmanCng(CngKey) |
Initialise une nouvelle instance de la ECDiffieHellmanCng classe à l’aide de l’objet spécifié CngKey . |
| ECDiffieHellmanCng(ECCurve) |
Crée une instance de la classe dont la ECDiffieHellmanCng paire de clés publique/privée est générée sur la courbe spécifiée. |
| ECDiffieHellmanCng(Int32) |
Initialise une nouvelle instance de la ECDiffieHellmanCng classe avec une paire de clés aléatoire, à l’aide de la taille de clé spécifiée. |
Champs
| Nom | Description |
|---|---|
| KeySizeValue |
Représente la taille, en bits, du module de clé utilisé par l’algorithme asymétrique. (Hérité de AsymmetricAlgorithm) |
| LegalKeySizesValue |
Spécifie les tailles de clé prises en charge par l’algorithme asymétrique. (Hérité de AsymmetricAlgorithm) |
Propriétés
| Nom | Description |
|---|---|
| HashAlgorithm |
Obtient ou définit l’algorithme de hachage à utiliser lors de la génération de matériel de clé. |
| HmacKey |
Obtient ou définit la clé HMAC (Hash-based Message Authentication Code) à utiliser lors de la dérivation du matériau de clé. |
| Key |
Spécifie celui CngKey utilisé par l’objet actuel pour les opérations de chiffrement. |
| KeyDerivationFunction |
Obtient ou définit la fonction de dérivation de clé pour la ECDiffieHellmanCng classe. |
| KeyExchangeAlgorithm |
Obtient le nom de l’algorithme d’échange de clés. (Hérité de ECDiffieHellman) |
| KeySize |
Obtient ou définit la taille, en bits, du module de clé utilisé par l’algorithme asymétrique. (Hérité de AsymmetricAlgorithm) |
| Label |
Obtient ou définit la valeur d’étiquette utilisée pour la dérivation de clé. |
| LegalKeySizes |
Obtient les tailles de clé prises en charge par l’algorithme asymétrique. (Hérité de AsymmetricAlgorithm) |
| PublicKey |
Obtient la clé publique qui peut être utilisée par un autre ECDiffieHellmanCng objet pour générer un contrat de secret partagé. |
| SecretAppend |
Obtient ou définit une valeur qui sera ajoutée au contrat secret lors de la génération de matériel de clé. |
| SecretPrepend |
Obtient ou définit une valeur qui sera ajoutée au début de l’accord secret lors de la dérivation du matériel de clé. |
| Seed |
Obtient ou définit la valeur initiale qui sera utilisée lors de la dérivation du matériau de clé. |
| SignatureAlgorithm |
Obtient le nom de l’algorithme de signature. (Hérité de ECDiffieHellman) |
| UseSecretAgreementAsHmacKey |
Obtient une valeur qui indique si le contrat secret est utilisé comme clé HMAC (Hash-based Message Authentication Code) pour dériver le matériel de clé. |
Méthodes
| Nom | Description |
|---|---|
| Clear() |
Libère toutes les ressources utilisées par la AsymmetricAlgorithm classe. (Hérité de AsymmetricAlgorithm) |
| DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[]) |
Effectue une dérivation de clé à l’aide d’un algorithme de hachage spécifié avec des données prédéfinies ou ajoutées facultatives. |
| DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName) |
Effectue une dérivation de clé à l’aide d’un algorithme de hachage spécifié. (Hérité de ECDiffieHellman) |
| DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[], Byte[]) |
Effectue une dérivation de clé à l’aide d’un algorithme HMAC (Code d’authentification de message basé sur le hachage) spécifié avec des données ajoutées ou prédéfinies facultatives. |
| DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[]) |
Effectue une dérivation de clé à l’aide d’un algorithme HMAC (Code d’authentification de message basé sur le hachage) spécifié. (Hérité de ECDiffieHellman) |
| DeriveKeyMaterial(CngKey) |
Dérive le matériel clé généré à partir de l’accord secret entre deux parties, en fonction d’un CngKey objet qui contient la clé publique de la deuxième partie. |
| DeriveKeyMaterial(ECDiffieHellmanPublicKey) |
Dérive le matériel clé généré à partir de l’accord secret entre deux parties, en fonction d’un ECDiffieHellmanPublicKey objet qui contient la clé publique de la deuxième partie. |
| DeriveKeyTls(ECDiffieHellmanPublicKey, Byte[], Byte[]) |
Effectue une dérivation de clé à l’aide du protocole TLS (Transport Layer Security) 1.1 PRF (Pseudo-Random Function). |
| DeriveSecretAgreementHandle(CngKey) |
Obtient un handle du contrat secret généré entre deux parties, en fonction d’un CngKey objet qui contient la clé publique du deuxième tiers. |
| DeriveSecretAgreementHandle(ECDiffieHellmanPublicKey) |
Obtient un handle du contrat secret généré entre deux parties, en fonction d’un ECDiffieHellmanPublicKey objet qui contient la clé publique du deuxième tiers. |
| Dispose() |
Libère toutes les ressources utilisées par l’instance actuelle de la AsymmetricAlgorithm classe. (Hérité de AsymmetricAlgorithm) |
| Dispose(Boolean) |
Libère les ressources non managées utilisées par la AsymmetricAlgorithm classe et libère éventuellement les ressources managées. (Hérité de AsymmetricAlgorithm) |
| Equals(Object) |
Détermine si l’objet spécifié est égal à l’objet actuel. (Hérité de Object) |
| ExportExplicitParameters(Boolean) |
Exporte les paramètres de courbe clé et explicite utilisés par l’objet ECCurve dans un ECParameters objet. |
| ExportParameters(Boolean) |
Exporte la clé utilisée par l’objet ECCurve dans un ECParameters objet. |
| FromXmlString(String, ECKeyXmlFormat) |
Désérialise les informations de clé d’une chaîne XML à l’aide du format spécifié. |
| FromXmlString(String) |
Cette méthode n’est pas implémentée. |
| GenerateKey(ECCurve) |
Génère une nouvelle paire de clés publique/privée éphémère pour la courbe spécifiée. |
| GetHashCode() |
Sert de fonction de hachage par défaut. (Hérité de Object) |
| GetType() |
Obtient la Type de l’instance actuelle. (Hérité de Object) |
| ImportParameters(ECParameters) |
Importe les paramètres spécifiés pour un ECCurve objet en tant que clé dans l’instance actuelle. |
| MemberwiseClone() |
Crée une copie superficielle du Objectactuel. (Hérité de Object) |
| ToString() |
Retourne une chaîne qui représente l’objet actuel. (Hérité de Object) |
| ToXmlString(Boolean) |
Cette méthode n’est pas implémentée. |
| ToXmlString(ECKeyXmlFormat) |
Sérialise les informations de clé dans une chaîne XML à l’aide du format spécifié. |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| IDisposable.Dispose() |
Cette API prend en charge l'infrastructure du produit et n'est pas destinée à être utilisée directement à partir de votre code. Pour obtenir une description de ce membre, consultez Dispose(). (Hérité de AsymmetricAlgorithm) |