ECDiffieHellmanCng クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ECDH (Elliptic Curve Diffie-Hellman) アルゴリズムの CNG (Cryptography Next Generation) 実装を提供します。 このクラスは、暗号化操作の実行に使用されます。
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 オブジェクトのインスタンスの一連のプロパティを使用します。
キー派生関数 | Properties |
---|---|
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) |
指定した CngKey オブジェクトを使用して、ECDiffieHellmanCng クラスの新しいインスタンスを初期化します。 |
ECDiffieHellmanCng(ECCurve) |
指定した曲線に対して生成された公開/秘密キー ペアの ECDiffieHellmanCng クラスの新しいインスタンスを作成します。 |
ECDiffieHellmanCng(Int32) |
指定されたキー サイズを使用して、ランダムなキー ペアで、ECDiffieHellmanCng クラスの新しいインスタンスを初期化します。 |
フィールド
KeySizeValue |
非対称アルゴリズムで使用されるキー モジュラスのサイズをビット単位で表します。 (継承元 AsymmetricAlgorithm) |
LegalKeySizesValue |
非対称アルゴリズムでサポートされているキー サイズを指定します。 (継承元 AsymmetricAlgorithm) |
プロパティ
HashAlgorithm |
キー マテリアルの生成時に使用するハッシュ アルゴリズムを取得または設定します。 |
HmacKey |
キー マテリアル派生時に使用するハッシュ メッセージ認証コード (HMAC: Hash-based Message Authentication Code) キーを取得または設定します。 |
Key |
現在のオブジェクトが暗号化操作のために使用する CngKey を指定します。 |
KeyDerivationFunction |
ECDiffieHellmanCng クラスのキー派生関数を取得または設定します。 |
KeyExchangeAlgorithm |
キー交換アルゴリズムの名前を取得します。 (継承元 ECDiffieHellman) |
KeySize |
非対称アルゴリズムで使用されるキー モジュラスのサイズをビット単位で取得または設定します。 |
KeySize |
非対称アルゴリズムで使用されるキー モジュラスのサイズをビット単位で取得または設定します。 (継承元 AsymmetricAlgorithm) |
Label |
キー派生で使用されるラベル値を取得または設定します。 |
LegalKeySizes | |
LegalKeySizes |
非対称アルゴリズムでサポートされているキー サイズを取得します。 (継承元 AsymmetricAlgorithm) |
PublicKey |
別の ECDiffieHellmanCng オブジェクトが共有秘密協定を生成するために使用できる公開キーを取得します。 |
SecretAppend |
キー マテリアル生成時に秘密協定に追加される値を取得または設定します。 |
SecretPrepend |
キー マテリアル派生時に秘密協定の開始部分に追加される値を取得または設定します。 |
Seed |
キー マテリアル派生時に使用されるシード値を取得または設定します。 |
SignatureAlgorithm |
署名アルゴリズムの名前を取得します。 (継承元 ECDiffieHellman) |
UseSecretAgreementAsHmacKey |
キー マテリアルを派生させるハッシュ メッセージ認証コード (HMAC) キーとして秘密協定が使用されるかどうかを示す値を取得します。 |
メソッド
明示的なインターフェイスの実装
IDisposable.Dispose() |
この API は製品インフラストラクチャをサポートします。コードから直接使用するものではありません。 このメンバーの詳細については、「Dispose()」をご覧ください。 (継承元 AsymmetricAlgorithm) |