ECDiffieHellmanCng 클래스

정의

ECDH(타원 곡선 Diffie-Hellman) 알고리즘의 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. Alice와 Bob은 Diffie-Hellman 키 교환 작업에 사용할 키 쌍을 만듭니다.

  2. Alice와 Bob은 동의한 매개 변수를 사용하여 KDF를 구성합니다.

  3. Alice는 Bob에게 공개 키를 보냅니다.

  4. Bob은 Alice에게 공개 키를 보냅니다.

  5. Alice와 Bob은 서로의 공개 키를 사용하여 비밀 계약을 생성하고 KDF를 비밀 계약에 적용하여 키 자료를 생성합니다.

생성자

Name Description
ECDiffieHellmanCng()

임의 키 쌍을 사용하여 클래스의 ECDiffieHellmanCng 새 인스턴스를 초기화합니다.

ECDiffieHellmanCng(CngKey)

지정된 ECDiffieHellmanCng 개체를 사용하여 CngKey 클래스의 새 인스턴스를 초기화합니다.

ECDiffieHellmanCng(ECCurve)

지정된 곡선을 ECDiffieHellmanCng 통해 퍼블릭/프라이빗 키 쌍이 생성되는 클래스의 새 인스턴스를 만듭니다.

ECDiffieHellmanCng(Int32)

지정된 키 크기를 사용하여 임의 키 쌍을 사용하여 클래스의 ECDiffieHellmanCng 새 인스턴스를 초기화합니다.

필드

Name Description
KeySizeValue

비대칭 알고리즘에서 사용하는 키 모듈러스의 크기를 비트 단위로 나타냅니다.

(다음에서 상속됨 AsymmetricAlgorithm)
LegalKeySizesValue

비대칭 알고리즘에서 지원하는 키 크기를 지정합니다.

(다음에서 상속됨 AsymmetricAlgorithm)

속성

Name Description
HashAlgorithm

키 자료를 생성할 때 사용할 해시 알고리즘을 가져오거나 설정합니다.

HmacKey

키 자료를 파생할 때 사용할 해시 기반 HMAC(메시지 인증 코드) 키를 가져오거나 설정합니다.

Key

암호화 작업에 현재 개체에서 사용되는 개체를 지정 CngKey 합니다.

KeyDerivationFunction

클래스의 키 파생 함수를 ECDiffieHellmanCng 가져오거나 설정합니다.

KeyExchangeAlgorithm

키 교환 알고리즘의 이름을 가져옵니다.

(다음에서 상속됨 ECDiffieHellman)
KeySize

비대칭 알고리즘에서 사용하는 키 모듈러스의 크기를 비트 단위로 가져오거나 설정합니다.

(다음에서 상속됨 AsymmetricAlgorithm)
Label

키 파생에 사용되는 레이블 값을 가져오거나 설정합니다.

LegalKeySizes

비대칭 알고리즘에서 지원하는 키 크기를 가져옵니다.

(다음에서 상속됨 AsymmetricAlgorithm)
PublicKey

다른 ECDiffieHellmanCng 개체에서 공유 비밀 계약을 생성하는 데 사용할 수 있는 공개 키를 가져옵니다.

SecretAppend

키 자료를 생성할 때 비밀 계약에 추가할 값을 가져오거나 설정합니다.

SecretPrepend

키 자료를 파생할 때 비밀 규약의 시작 부분에 추가될 값을 가져오거나 설정합니다.

Seed

키 자료를 파생할 때 사용할 시드 값을 가져오거나 설정합니다.

SignatureAlgorithm

서명 알고리즘의 이름을 가져옵니다.

(다음에서 상속됨 ECDiffieHellman)
UseSecretAgreementAsHmacKey

비밀 계약이 키 자료를 파생하기 위해 해시 기반 HMAC(메시지 인증 코드) 키로 사용되는지 여부를 나타내는 값을 가져옵니다.

메서드

Name Description
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 문자열로 직렬화합니다.

명시적 인터페이스 구현

Name Description
IDisposable.Dispose()

이 API는 제품 인프라를 지원하며 코드에서 직접 사용되지 않습니다.

이 멤버에 대한 설명은 을 참조하세요 Dispose().

(다음에서 상속됨 AsymmetricAlgorithm)

적용 대상