ECDiffieHellmanCng Classe

Définition

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 :

  1. Alice et Bob créent une paire de clés à utiliser pour l’opération d’échange de clés Diffie-Hellman

  2. Alice et Bob configurent le KDF à l’aide des paramètres sur utilisant l’accord.

  3. Alice envoie Bob sa clé publique.

  4. Bob envoie à Alice sa clé publique.

  5. 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)

S’applique à