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 выглядит следующим образом:
Алиса и Боб создают пару ключей для использования для операции обмена ключами Diffie-Hellman
Алиса и Боб настраивают KDF с помощью параметров, которые согласуются.
Алиса отправляет Боба ее открытый ключ.
Боб отправляет Алису его открытый ключ.
Алиса и Боб используют открытые ключи друг друга для создания секретного соглашения и применения 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) |