ECDiffieHellmanCng 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供 Elliptic Curve Diffie-Hellman (ECDH) 演算法的 Cryptography Next Generation (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 可讓兩方交換私鑰數據,即使它們透過公用通道進行通訊也一樣。 這兩方可以計算相同的秘密值,這稱為 Managed 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) |
使用指定的 CngKey 物件,初始化 ECDiffieHellmanCng 類別的新執行個體。 |
ECDiffieHellmanCng(ECCurve) |
建立 ECDiffieHellmanCng 類別的新執行個體,其公開/私密金鑰組是在指定的曲線上所產生。 |
ECDiffieHellmanCng(Int32) |
使用指定金鑰大小的隨機金鑰組,初始化 ECDiffieHellmanCng 類別的新執行個體。 |
欄位
KeySizeValue |
表示非對稱演算法使用的金鑰模數大小,以位元為單位。 (繼承來源 AsymmetricAlgorithm) |
LegalKeySizesValue |
指定非對稱演算法所支援的金鑰大小。 (繼承來源 AsymmetricAlgorithm) |
屬性
HashAlgorithm |
取得或設定產生金鑰內容時使用的雜湊演算法。 |
HmacKey |
取得或設定「雜湊式訊息驗證碼」(Hash-based Message Authentication Code,HMAC) 金鑰,以便在衍生金鑰內容時使用。 |
Key |
指定 CngKey,由目前物件用於密碼編譯作業。 |
KeyDerivationFunction |
取得或設定 ECDiffieHellmanCng 類別的金鑰衍生函數。 |
KeyExchangeAlgorithm |
取得金鑰交換演算法的名稱。 (繼承來源 ECDiffieHellman) |
KeySize |
取得或設定非對稱演算法使用的金鑰模數大小,以位元為單位。 |
KeySize |
取得或設定非對稱演算法使用的金鑰模數大小,以位元為單位。 (繼承來源 AsymmetricAlgorithm) |
Label |
取得或設定標籤值,用於金鑰衍生。 |
LegalKeySizes |
取得非對稱演算法所支援的金鑰大小。 |
LegalKeySizes |
取得非對稱演算法所支援的金鑰大小。 (繼承來源 AsymmetricAlgorithm) |
PublicKey |
取得公開金鑰,可讓其他 ECDiffieHellmanCng 物件用來產生共用的密碼協議。 |
SecretAppend |
取得或設定值,該值將在產生金鑰內容時附加到密碼協議。 |
SecretPrepend |
取得或設定值,該值將在衍生金鑰內容時加入至密碼協議的開頭。 |
Seed |
取得或設定值,該值將在衍生金鑰內容時使用。 |
SignatureAlgorithm |
取得簽章演算法的名稱。 (繼承來源 ECDiffieHellman) |
UseSecretAgreementAsHmacKey |
取得值,表示密碼協議是否做為「雜湊式訊息驗證碼」(Hash-based Message Authentication Code,HMAC) 金鑰用來衍生金鑰內容。 |
方法
明確介面實作
IDisposable.Dispose() |
此 API 支援此產品基礎結構,但無法直接用於程式碼之中。 如需這個成員的說明,請參閱 Dispose()。 (繼承來源 AsymmetricAlgorithm) |