ECDiffieHellmanCng クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
楕円曲線 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 クラスを使用すると、公開チャネルを介して通信している場合でも、2 人のパーティが秘密キーマテリアルを交換できます。 両方の当事者は、マネージド Diffie-Hellman クラスの 秘密契約 と呼ばれる同じシークレット値を計算できます。 秘密契約は、対称キーなど、さまざまな目的で使用できます。 ただし、秘密契約を直接公開する代わりに、 ECDiffieHellmanCng クラスは値を指定する前に、契約に対していくつかの後処理を行います。 この後処理は、 キー派生関数 (KDF) と呼ばれます。使用する KDF を選択し、Diffie-Hellman オブジェクトのインスタンスの一連のプロパティを使用してそのパラメーターを設定できます。
| キー派生関数 | プロパティ |
|---|---|
| Hash |
HashAlgorithm - 秘密契約の処理に使用されるハッシュ アルゴリズム。 SecretPrepend - ハッシュする前にシークレット アグリーメントの前に付加する省略可能なバイト配列。 SecretAppend - ハッシュする前にシークレット アグリーメントに追加する省略可能なバイト配列。 |
| Hmac |
HashAlgorithm - 秘密契約の処理に使用されるハッシュ アルゴリズム。 SecretPrepend- ハッシュする前にシークレット アグリーメントの前に付加する省略可能なバイト配列。 SecretAppend - ハッシュする前にシークレット アグリーメントに追加する省略可能なバイト配列。 |
| Tls |
Label - キー派生のラベル。 Seed - キー派生のシード。 |
キー派生関数を介して秘密契約を渡した結果は、アプリケーションのキー マテリアルとして使用できるバイト配列です。 生成されるキー マテリアルのバイト数は、キー派生関数に依存します。たとえば、SHA-256 では 256 ビットのキー マテリアルが生成され、SHA-512 では 512 ビットのキー マテリアルが生成されます。 ECDH キー交換の基本的なフローは次のとおりです。
Alice と Bob が、Diffie-Hellman キー交換操作に使用するキー ペアを作成する
Alice と Bob は、同意するパラメーターを使用して KDF を構成します。
Alice は Bob に公開キーを送信します。
Bob は Alice に公開キーを送信します。
Alice と Bob は互いの公開キーを使用して秘密契約を生成し、キー マテリアルを生成するために秘密契約に KDF を適用します。
コンストラクター
| 名前 | 説明 |
|---|---|
| ECDiffieHellmanCng() |
ランダムなキー ペアを使用して、 ECDiffieHellmanCng クラスの新しいインスタンスを初期化します。 |
| ECDiffieHellmanCng(CngKey) |
指定したECDiffieHellmanCng オブジェクトを使用して、CngKey クラスの新しいインスタンスを初期化します。 |
| 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) |
第 2 者の公開キーを含む CngKey オブジェクトが与えられた場合、2 者間の秘密契約から生成されるキー マテリアルを派生させます。 |
| DeriveKeyMaterial(ECDiffieHellmanPublicKey) |
第 2 者の公開キーを含む ECDiffieHellmanPublicKey オブジェクトが与えられた場合、2 者間の秘密契約から生成されるキー マテリアルを派生させます。 |
| DeriveKeyTls(ECDiffieHellmanPublicKey, Byte[], Byte[]) |
TLS (トランスポート層セキュリティ) 1.1 PRF (Pseudo-Random 関数) を使用してキー派生を実行します。 |
| DeriveSecretAgreementHandle(CngKey) |
第 2 者の公開キーを含む CngKey オブジェクトを指定して、2 者間で生成された秘密契約のハンドルを取得します。 |
| DeriveSecretAgreementHandle(ECDiffieHellmanPublicKey) |
第 2 者の公開キーを含む ECDiffieHellmanPublicKey オブジェクトを指定して、2 者間で生成された秘密契約のハンドルを取得します。 |
| 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) |