ECDiffieHellmanCng 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供椭圆曲线 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 使双方能够交换私钥材料,即使他们通过公共渠道进行通信。 双方可以计算相同的机密值,即托管 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 和 Bob 使用彼此的公钥生成机密协议,并将 KDF 应用于机密协议以生成密钥材料。
构造函数
ECDiffieHellmanCng() |
使用随机的密钥对初始化 ECDiffieHellmanCng 类的新实例。 |
ECDiffieHellmanCng(CngKey) |
使用指定的 CngKey 对象初始化 ECDiffieHellmanCng 类的新实例。 |
ECDiffieHellmanCng(ECCurve) |
创建 ECDiffieHellmanCng 类的新实例,其公钥/私钥对通过指定曲线生成。 |
ECDiffieHellmanCng(Int32) |
使用指定密钥大小,通过随机密钥对来初始化 ECDiffieHellmanCng 类的新实例。 |
字段
KeySizeValue |
表示非对称算法所用密钥模块的大小(以位为单位)。 (继承自 AsymmetricAlgorithm) |
LegalKeySizesValue |
指定非对称算法支持的密钥大小。 (继承自 AsymmetricAlgorithm) |
属性
HashAlgorithm |
获取或设置生成密钥材料时要使用的哈希算法。 |
HmacKey |
获取或设置派生密钥材料时要使用的基于哈希的消息身份验证代码 (HMAC) 密钥。 |
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) |