ECDiffieHellmanCng Класс

Определение

Предоставляет реализацию алгоритма elliptic Curve Diffie-Hellman (ECDH) следующего поколения (CNG). Этот класс используется для выполнения криптографических операций.

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
Наследование

Примеры

В следующем примере показано, как использовать ECDiffieHellmanCng класс для установления обмена ключами и использования этого ключа для шифрования сообщения, которое может быть отправлено через общедоступный канал и расшифровано получателем.

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

Комментарии

Класс ECDiffieHellmanCng позволяет двум сторонам обмениваться данными с закрытым ключом, даже если они взаимодействуют через общедоступный канал. Обе стороны могут вычислить одно и то же значение секрета, которое называется секретным соглашением в управляемых Diffie-Hellman классах. Затем секретное соглашение можно использовать для различных целей, включая симметричный ключ. Однако вместо прямого предоставления секретного соглашения ECDiffieHellmanCng класс выполняет некоторую после обработки соглашения перед предоставлением значения. Эта после обработки называется функцией производного ключа (KDF); вы можете выбрать, какой KDF необходимо использовать и задать его параметры с помощью набора свойств экземпляра объекта Diffie-Hellman.

Функция производных ключей Properties
Hash HashAlgorithm — хэш-алгоритм, используемый для обработки секретного соглашения.

SecretPrepend — необязательный массив байтов для подготовки к секретному соглашению перед хэшированием.

SecretAppend — необязательный массив байтов, добавляемый к секретному соглашению перед хэшированием.
Hmac HashAlgorithm — хэш-алгоритм, используемый для обработки секретного соглашения.

SecretPrepend— необязательный массив байтов для подготовки к секретному соглашению перед хэшированием.

SecretAppend — необязательный массив байтов, добавляемый к секретному соглашению перед хэшированием.
Tls Label — метка для производных ключей.

Seed — начальное значение для производных ключей.

Результат передачи секретного соглашения через функцию производного ключа — это массив байтов, который может использоваться в качестве ключевого материала для приложения. Число байтов создаваемого материала ключа зависит от функции производности ключей; Например, SHA-256 создаст 256 битов ключевого материала, в то время как SHA-512 создаст 512 бит ключевого материала. Базовый поток обмена ключами ECDH выглядит следующим образом:

  1. Алиса и Боб создают пару ключей для использования для операции обмена ключами Diffie-Hellman

  2. Алиса и Боб настраивают KDF с помощью параметров, которые согласуются.

  3. Алиса отправляет Боба ее открытый ключ.

  4. Боб отправляет Алису его открытый ключ.

  5. Алиса и Боб используют открытые ключи друг друга для создания секретного соглашения и применения KDF к секретному соглашению для создания ключевых материалов.

Конструкторы

Имя Описание
ECDiffieHellmanCng()

Инициализирует новый экземпляр класса с помощью случайной пары ключей ECDiffieHellmanCng .

ECDiffieHellmanCng(CngKey)

Инициализирует новый экземпляр класса с помощью указанного ECDiffieHellmanCngCngKey объекта.

ECDiffieHellmanCng(ECCurve)

Создает новый экземпляр класса, пара открытого и закрытого ECDiffieHellmanCng ключа которого создается по указанной кривой.

ECDiffieHellmanCng(Int32)

Инициализирует новый экземпляр класса с помощью случайной пары ключей ECDiffieHellmanCng , используя указанный размер ключа.

Поля

Имя Описание
KeySizeValue

Представляет размер в битах модуля ключа, используемого асимметричным алгоритмом.

(Унаследовано от AsymmetricAlgorithm)
LegalKeySizesValue

Указывает размеры ключей, поддерживаемые асимметричным алгоритмом.

(Унаследовано от AsymmetricAlgorithm)

Свойства

Имя Описание
HashAlgorithm

Возвращает или задает хэш-алгоритм, используемый при создании материала ключа.

HmacKey

Возвращает или задает ключ на основе хэш-кода проверки подлинности сообщений (HMAC), используемый при выводе материала ключа.

Key

Указывает CngKey , что используется текущим объектом для криптографических операций.

KeyDerivationFunction

Возвращает или задает функцию производных ключей ECDiffieHellmanCng для класса.

KeyExchangeAlgorithm

Возвращает имя алгоритма обмена ключами.

(Унаследовано от ECDiffieHellman)
KeySize

Возвращает или задает размер в битах модуля ключа, используемого асимметричным алгоритмом.

(Унаследовано от AsymmetricAlgorithm)
Label

Возвращает или задает значение метки, используемое для получения ключа.

LegalKeySizes

Возвращает размеры ключей, поддерживаемые асимметричным алгоритмом.

(Унаследовано от AsymmetricAlgorithm)
PublicKey

Получает открытый ключ, который может использоваться другим ECDiffieHellmanCng объектом для создания соглашения общего секрета.

SecretAppend

Возвращает или задает значение, которое будет добавлено в секретное соглашение при создании материала ключа.

SecretPrepend

Возвращает или задает значение, которое будет добавлено в начало секретного соглашения при выводе материала ключа.

Seed

Возвращает или задает начальное значение, которое будет использоваться при выводе материала ключа.

SignatureAlgorithm

Возвращает имя алгоритма подписи.

(Унаследовано от ECDiffieHellman)
UseSecretAgreementAsHmacKey

Возвращает значение, указывающее, используется ли секретное соглашение в качестве ключа проверки подлинности на основе хэша (HMAC) для получения материала ключа.

Методы

Имя Описание
Clear()

Освобождает все ресурсы, используемые классом AsymmetricAlgorithm .

(Унаследовано от AsymmetricAlgorithm)
DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[])

Выполняет производный ключ с помощью заданного хэш-алгоритма с необязательными предварительно заданными или добавленными данными.

DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName)

Выполняет производный ключ с помощью указанного хэш-алгоритма.

(Унаследовано от ECDiffieHellman)
DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[], Byte[])

Выполняет производный ключ с помощью указанного алгоритма HMAC (код проверки подлинности на основе хэша) с необязательными предварительно заданными или добавленными данными.

DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[])

Выполняет производный ключ с помощью заданного алгоритма HMAC (код проверки подлинности на основе хэша).

(Унаследовано от ECDiffieHellman)
DeriveKeyMaterial(CngKey)

Извлекает ключевой материал, созданный из секретного соглашения между двумя сторонами, учитывая CngKey объект, содержащий открытый ключ второй стороны.

DeriveKeyMaterial(ECDiffieHellmanPublicKey)

Извлекает ключевой материал, созданный из секретного соглашения между двумя сторонами, учитывая ECDiffieHellmanPublicKey объект, содержащий открытый ключ второй стороны.

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

Выполняет производный ключ с помощью ПРОТОКОЛА TLS (транспортная безопасность) 1.1 PRF (функцияPseudo-Random).

DeriveSecretAgreementHandle(CngKey)

Получает дескриптор секретного соглашения, созданного между двумя сторонами, учитывая CngKey объект, содержащий открытый ключ второй стороны.

DeriveSecretAgreementHandle(ECDiffieHellmanPublicKey)

Получает дескриптор секретного соглашения, созданного между двумя сторонами, учитывая ECDiffieHellmanPublicKey объект, содержащий открытый ключ второй стороны.

Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса AsymmetricAlgorithm.

(Унаследовано от AsymmetricAlgorithm)
Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые классом AsymmetricAlgorithm , и при необходимости освобождает управляемые ресурсы.

(Унаследовано от AsymmetricAlgorithm)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
ExportExplicitParameters(Boolean)

Экспортирует ключ и явные параметры кривой, используемые ECCurve объектом в ECParameters объект.

ExportParameters(Boolean)

Экспортирует ключ, используемый ECCurve объектом в ECParameters объект.

FromXmlString(String, ECKeyXmlFormat)

Десериализация ключевых сведений из XML-строки с помощью указанного формата.

FromXmlString(String)

Этот метод не реализуется.

GenerateKey(ECCurve)

Создает новую эфемерную пару открытого и закрытого ключа для указанной кривой.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
ImportParameters(ECParameters)

Импортирует указанные параметры объекта ECCurve в качестве ключа в текущий экземпляр.

MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
ToXmlString(Boolean)

Этот метод не реализуется.

ToXmlString(ECKeyXmlFormat)

Сериализует сведения ключа в XML-строку с помощью указанного формата.

Явные реализации интерфейса

Имя Описание
IDisposable.Dispose()

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.

Описание этого элемента см. в разделе Dispose().

(Унаследовано от AsymmetricAlgorithm)

Применяется к