ECDiffieHellmanCng 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供次世代密碼學(CNG)實現的橢圓曲線 Diffie-Hellman(ECDH)演算法。 此類別用於執行密碼學操作。
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 物件實例上的一組屬性設定參數。
| 密鑰推導函數 | 屬性 |
|---|---|
| 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。
愛麗絲把她的公鑰寄給鮑勃。
Bob 把他的公開金鑰傳給 Alice。
Alice 和 Bob 使用彼此的公鑰來產生秘密協議,並將 KDF 應用於秘密協議以產生密鑰材料。
建構函式
| 名稱 | Description |
|---|---|
| ECDiffieHellmanCng() |
初始化一個隨機金鑰對的新類別實例 ECDiffieHellmanCng 。 |
| ECDiffieHellmanCng(CngKey) |
使用指定的 ECDiffieHellmanCng 物件,初始化 CngKey 類別的新實例。 |
| ECDiffieHellmanCng(ECCurve) |
建立一個新的類別實例 ECDiffieHellmanCng ,其公私鑰對是在指定的曲線上產生的。 |
| ECDiffieHellmanCng(Int32) |
使用指定的金鑰大小,初始化一個隨機金鑰對的新類別實例 ECDiffieHellmanCng 。 |
欄位
| 名稱 | Description |
|---|---|
| KeySizeValue |
代表非對稱演算法所使用的金鑰模數的大小(以位元為單位)。 (繼承來源 AsymmetricAlgorithm) |
| LegalKeySizesValue |
指定非對稱演算法所支援的金鑰大小。 (繼承來源 AsymmetricAlgorithm) |
屬性
| 名稱 | Description |
|---|---|
| HashAlgorithm |
取得或設定雜湊演算法,用於產生關鍵資料。 |
| HmacKey |
取得或設定基於雜湊的訊息認證碼(HMAC)金鑰,用於導出金鑰資料。 |
| Key |
指定 CngKey 當前物件用於密碼學運算的 that。 |
| KeyDerivationFunction |
取得或設定類別的 ECDiffieHellmanCng 金鑰推導函數。 |
| KeyExchangeAlgorithm |
取得金鑰交換演算法的名稱。 (繼承來源 ECDiffieHellman) |
| KeySize |
取得或設定非對稱演算法所使用的金鑰模數的大小(以位元為單位)。 |
| KeySize |
取得或設定非對稱演算法所使用的金鑰模數的大小(以位元為單位)。 (繼承來源 AsymmetricAlgorithm) |
| Label |
取得或設定用於金鑰推導的標籤值。 |
| LegalKeySizes |
取得非對稱演算法所支援的金鑰大小。 |
| LegalKeySizes |
取得非對稱演算法所支援的金鑰大小。 (繼承來源 AsymmetricAlgorithm) |
| PublicKey |
取得公鑰,其他物件可用 ECDiffieHellmanCng 來產生共享秘密協議。 |
| SecretAppend |
取得或設定一個值,並在產生關鍵資料時附加於秘密協議後。 |
| SecretPrepend |
取得或設定一個值,並在推導關鍵資料時加到秘密協議的開頭。 |
| Seed |
取得或設定用於推導關鍵材料的種子值。 |
| SignatureAlgorithm |
取得簽名演算法的名稱。 (繼承來源 ECDiffieHellman) |
| UseSecretAgreementAsHmacKey |
會獲得一個值,指示秘密協議是否作為基於雜湊的訊息認證碼(HMAC)金鑰來推導金鑰資料。 |
方法
明確介面實作
| 名稱 | Description |
|---|---|
| IDisposable.Dispose() |
此 API 支援此產品基礎結構,但無法直接用於程式碼之中。 關於此成員的描述,請參見 Dispose()。 (繼承來源 AsymmetricAlgorithm) |