AsymmetricKeyAlgorithmProvider Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Rappresenta un provider di algoritmi di chiave asimmetrica (pubblica). Per altre informazioni, vedere Chiavi crittografiche.
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
- Ereditarietà
- Attributi
Requisiti Windows
Famiglia di dispositivi |
Windows 10 (è stato introdotto in 10.0.10240.0)
|
API contract |
Windows.Foundation.UniversalApiContract (è stato introdotto in v1.0)
|
Esempio
Poiché la crittografia asimmetrica è molto più lenta di quella simmetrica, viene usata raramente per crittografare direttamente grandi quantità di dati. In genere, viene invece usata nel modo seguente per crittografare le chiavi.
- Alice chiede a Roberto di inviarle solo messaggi crittografati.
- Alice crea una coppia di chiavi privata/pubblica, tiene segreta la chiave privata e pubblica la chiave pubblica.
- Roberto vuole inviare un messaggio ad Alice.
- Roberto crea una chiave simmetrica.
- Roberto usa la nuova chiave simmetrica per crittografare il messaggio destinato ad Alice.
- Bob usa la chiave pubblica di Alice per crittografare la chiave simmetrica.
- Roberto invia il messaggio crittografato e la chiave simmetrica crittografata ad Alice (in busta digitale).
- Alice usa la propria chiave privata (della coppia privata/pubblica) per decrittografare la chiave simmetrica di Roberto.
- Alice usa la chiave simmetrica di Bob per decrittografare il messaggio. Gli aspetti del processo precedente che possono essere risolti nel codice sono illustrati nell'esempio seguente.
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);
}
}
}
Commenti
Si crea un oggetto AsymmetricKeyAlgorithmProvider chiamando il metodo OpenAlgorithm statico.
Proprietà
AlgorithmName |
Ottiene il nome dell'algoritmo asimmetrico aperto. |
Metodi
CreateKeyPair(UInt32) |
Crea una coppia di chiavi pubblica/privata. |
CreateKeyPairWithCurveName(String) |
Crea una coppia di chiavi pubblica/privata usando un nome di curva algoritmica. |
CreateKeyPairWithCurveParameters(Byte[]) |
Crea una coppia di chiavi pubblica/privata asimmetrica usando i parametri della curva. |
ImportKeyPair(IBuffer) |
Importa una coppia di chiavi pubblica/privata da un buffer. |
ImportKeyPair(IBuffer, CryptographicPrivateKeyBlobType) |
Importa una coppia di chiavi pubblica/privata da un buffer nel formato specificato. |
ImportPublicKey(IBuffer) |
Importa una chiave pubblica in un buffer. |
ImportPublicKey(IBuffer, CryptographicPublicKeyBlobType) |
Importa una chiave pubblica in un buffer per un formato specificato. |
OpenAlgorithm(String) |
Crea un'istanza della classe AsymmetricKeyAlgorithmProvider e apre l'algoritmo specificato per l'uso. |