AsymmetricKeyAlgorithmProvider Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет поставщика алгоритмов асимметричного (открытого) ключа. Дополнительные сведения см. в разделе Криптографические ключи.
public ref class AsymmetricKeyAlgorithmProvider sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class AsymmetricKeyAlgorithmProvider final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class AsymmetricKeyAlgorithmProvider
Public NotInheritable Class AsymmetricKeyAlgorithmProvider
- Наследование
- Атрибуты
Требования к Windows
Семейство устройств |
Windows 10 (появилось в 10.0.10240.0)
|
API contract |
Windows.Foundation.UniversalApiContract (появилось в v1.0)
|
Примеры
Асимметричные алгоритмы шифрования гораздо медленнее симметричных алгоритмов, поэтому они редко используются непосредственно для шифрования больших объемов данных. Вместо этого они используются для шифрования ключей следующим образом.
- Алисе нужно, чтобы Боб отправлял ей только зашифрованные сообщения.
- Алиса создает пару "открытый/закрытый ключ", сохраняет секрет своего закрытого ключа и публикует открытый ключ.
- У Боба есть сообщение, которое он хочет отправить Алисе.
- Боб создает симметричный ключ.
- Боб использует свой новый симметричный ключ для того, чтобы зашифровать сообщение для Алисы.
- Боб использует открытый ключ Алисы для шифрования симметричного ключа.
- Боб отправляет зашифрованное сообщение и симметричный ключ шифрования Алисе (в конверте передачи сообщения).
- Алиса использует свой закрытый ключ (из пары закрытый-открытый ключ) для того, чтобы расшифровать симметричный ключ Боба.
- Алиса использует симметричный ключ Боба для расшифровки сообщения. Аспекты предыдущего процесса, которые могут быть рассмотрены в коде, показаны в следующем примере.
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
namespace SampleAsymmetricKeyAlgorithmProvider
{
sealed partial class AsymmetricKeyAlgorithmApp : Application
{
static IBuffer buffKeyPair;
public AsymmetricKeyAlgorithmApp()
{
// Initialize the application.
this.InitializeComponent();
// Create a symmetric session key.
String strSymmetricAlgName = SymmetricAlgorithmNames.AesCbc;
UInt32 symmetricKeyLength = 32;
IBuffer buffSessionKey;
this.SampleCreateSymmetricSessionKey(
strSymmetricAlgName,
symmetricKeyLength,
out buffSessionKey);
// Create an asymmetric key pair.
String strAsymmetricAlgName = AsymmetricAlgorithmNames.RsaPkcs1;
UInt32 asymmetricKeyLength = 512;
IBuffer buffPublicKey;
this.SampleCreateAsymmetricKeyPair(
strAsymmetricAlgName,
asymmetricKeyLength,
out buffPublicKey);
// Encrypt the symmetric session key by using the asymmetric public key.
IBuffer buffEncryptedSessionKey;
this.SampleAsymmetricEncryptSessionKey(
strAsymmetricAlgName,
buffSessionKey,
buffPublicKey,
out buffEncryptedSessionKey);
// Decrypt the symmetric session key by using the asymmetric private key
// that corresponds to the public key used to encrypt the session key.
this.SampleAsymmetricDecryptSessionKey(
strAsymmetricAlgName,
strSymmetricAlgName,
buffEncryptedSessionKey);
}
public void SampleCreateSymmetricSessionKey(
string strSymmetricAlgName,
UInt32 keyLength,
out IBuffer buffSessionKey)
{
// Open a symmetric algorithm provider for the specified algorithm.
SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(strSymmetricAlgName);
// Create a symmetric session key.
IBuffer keyMaterial = CryptographicBuffer.GenerateRandom(keyLength);
CryptographicKey sessionKey = objAlg.CreateSymmetricKey(keyMaterial);
buffSessionKey = keyMaterial;
}
public void SampleCreateAsymmetricKeyPair(
String strAsymmetricAlgName,
UInt32 keyLength,
out IBuffer buffPublicKey)
{
// Open the algorithm provider for the specified asymmetric algorithm.
AsymmetricKeyAlgorithmProvider objAlgProv = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(strAsymmetricAlgName);
// Demonstrate use of the AlgorithmName property (not necessary to create a key pair).
String strAlgName = objAlgProv.AlgorithmName;
// Create an asymmetric key pair.
CryptographicKey keyPair = objAlgProv.CreateKeyPair(keyLength);
// Export the public key to a buffer for use by others.
buffPublicKey = keyPair.ExportPublicKey();
// You should keep your private key (embedded in the key pair) secure. For
// the purposes of this example, however, we're just copying it into a
// static class variable for later use during decryption.
AsymmetricKeyAlgorithmApp.buffKeyPair = keyPair.Export();
}
public void SampleAsymmetricEncryptSessionKey(
String strAsymmetricAlgName,
IBuffer buffSessionKeyToEncrypt,
IBuffer buffPublicKey,
out IBuffer buffEncryptedSessionKey)
{
// Open the algorithm provider for the specified asymmetric algorithm.
AsymmetricKeyAlgorithmProvider objAlgProv = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(strAsymmetricAlgName);
// Import the public key from a buffer.
CryptographicKey publicKey = objAlgProv.ImportPublicKey(buffPublicKey);
// Encrypt the session key by using the public key.
buffEncryptedSessionKey = CryptographicEngine.Encrypt(publicKey, buffSessionKeyToEncrypt, null);
}
public void SampleAsymmetricDecryptSessionKey(
String strAsymmetricAlgName,
String strSymmetricAlgName,
IBuffer buffEncryptedSessionKey)
{
// Open the algorithm provider for the specified asymmetric algorithm.
AsymmetricKeyAlgorithmProvider objAsymmAlgProv = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(strAsymmetricAlgName);
// Import the public key from a buffer. You should keep your private key
// secure. For the purposes of this example, however, the private key is
// just stored in a static class variable.
CryptographicKey keyPair = objAsymmAlgProv.ImportKeyPair(AsymmetricKeyAlgorithmApp.buffKeyPair);
// Use the private key embedded in the key pair to decrypt the session key.
IBuffer buffDecryptedSessionKey = CryptographicEngine.Decrypt(keyPair, buffEncryptedSessionKey, null);
// Convert the decrypted session key into a CryptographicKey object that
// can be used to decrypt the message that it previously encrypted (not shown).
SymmetricKeyAlgorithmProvider objSymmAlgProv = SymmetricKeyAlgorithmProvider.OpenAlgorithm(strSymmetricAlgName);
CryptographicKey sessionKey = objSymmAlgProv.CreateSymmetricKey(buffDecryptedSessionKey);
}
}
}
Комментарии
Объект AsymmetricKeyAlgorithmProvider создается путем вызова статического метода OpenAlgorithm .
Свойства
AlgorithmName |
Возвращает имя открытого асимметричного алгоритма. |
Методы
CreateKeyPair(UInt32) |
Создает пару открытого и закрытого ключей. |
CreateKeyPairWithCurveName(String) |
Создает пару открытого и закрытого ключей с использованием алгоритмического имени кривой. |
CreateKeyPairWithCurveParameters(Byte[]) |
Создает асимметричную пару открытого и закрытого ключей с помощью параметров кривой. |
ImportKeyPair(IBuffer) |
Импортирует пару открытого и закрытого ключей из буфера. |
ImportKeyPair(IBuffer, CryptographicPrivateKeyBlobType) |
Импортирует пару открытого и закрытого ключей из буфера в указанном формате. |
ImportPublicKey(IBuffer) |
Импортирует открытый ключ в буфер. |
ImportPublicKey(IBuffer, CryptographicPublicKeyBlobType) |
Импортирует открытый ключ в буфер для указанного формата. |
OpenAlgorithm(String) |
Создает экземпляр класса AsymmetricKeyAlgorithmProvider и открывает указанный алгоритм для использования. |