ECDiffieHellmanCng クラス

定義

楕円曲線 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 キー交換の基本的なフローは次のとおりです。

  1. Alice と Bob が、Diffie-Hellman キー交換操作に使用するキー ペアを作成する

  2. Alice と Bob は、同意するパラメーターを使用して KDF を構成します。

  3. Alice は Bob に公開キーを送信します。

  4. Bob は Alice に公開キーを送信します。

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

適用対象