Partager via


Procédure pas à pas : création d'une application de chiffrement

Mise à jour : novembre 2007

Cette procédure pas à pas indique comment chiffrer et déchiffrer le contenu. Les exemples de code sont conçus pour une application Windows Forms. Cette application ne décrit pas les scénarios réels, tels que l'utilisation des cartes à puce, mais elle décrit les notions fondamentales du chiffrement et du déchiffrement.

Cette procédure pas à pas utilise les indications suivantes pour le chiffrement :

  • Utilisez la classe RijndaelManaged, un algorithme symétrique, pour chiffrer et déchiffrer les données via sa Key et sa IV générées automatiquement.

  • Utilisez la RSACryptoServiceProvider, un algorithme asymétrique, pour chiffrer et déchiffrer la clé dans les données chiffrées via RijndaelManaged. L'utilisation des algorithmes asymétriques est plus optimale pour de petites quantités de données, comme une clé.

    Remarque :

    Si vous souhaitez protéger les données de votre ordinateur au lieu d'échanger le contenu chiffré avec d'autres personnes, utilisez les classes ProtectedData ou ProtectedMemory.

Le tableau suivant récapitule les tâches de chiffrement de cette rubrique.

Tâche

Description

Création d'une application Windows Forms

Répertorie les contrôles requis pour exécuter l'application.

Déclaration des objets globaux

Déclare les variables chaîne, la CspParameters et la RSACryptoServiceProvider pour obtenir le contexte global de la classe Form.

Création d'une clé asymétrique

Crée une paire de valeurs de clés privée et publique asymétriques et lui assigne un nom de conteneur de clé.

Chiffrement d'un fichier

Affiche une boîte de dialogue permettant de sélectionner un fichier pour le chiffrement et chiffre le fichier.

Déchiffrement d'un fichier

Affiche une boîte de dialogue permettant de sélectionner un fichier chiffré pour le déchiffrement et déchiffre le fichier.

Obtention d'une clé privée

Obtient la paire de clés complète à l'aide du nom de conteneur de clé.

Exportation d'une clé publique

Enregistre la clé dans un fichier XML avec les paramètres publics uniquement.

Importation d'une clé publique

Charge la clé à partir d'un fichier XML dans le conteneur de clé.

Test de l'application

Répertorie les procédures de test de cette application.

Composants requis

Vous avez besoin des composants suivants pour exécuter cette procédure pas à pas :

Création d'une application Windows Forms

La plupart des exemples de code de cette procédure pas à pas sont conçus pour être des gestionnaires d'événements pour les contrôles bouton. Le tableau suivant répertorie les contrôles requis pour l'exemple d'application, ainsi que les noms devant leur être attribués pour qu'ils correspondent aux exemples de code.

Contrôle

Nom

Propriété Text (si nécessaire)

Button

buttonEncryptFile

Chiffrer le fichier

Button

buttonDecryptFile

Déchiffrer le fichier

Button

buttonCreateAsmKeys

Créer des clés

Button

buttonExportPublicKey

Exporter la clé publique

Button

buttonImportPublicKey

Importer la clé publique

Button

buttonGetPrivateKey

Obtenir la clé privée

Label

label1

OpenFileDialog

openFileDialog1

OpenFileDialog

openFileDialog2

Double-cliquez sur les boutons dans le concepteur Visual Studio pour créer les gestionnaires d'événements correspondants.

Déclaration des objets globaux

Ajoutez le code suivant au constructeur du formulaire. Modifiez les variables chaîne pour votre environnement et vos préférences.

' Declare CspParmeters and RsaCryptoServiceProvider 
' objects with global scope of your Form class.
Dim cspp As CspParameters = New System.Security.Cryptography.CspParameters
Dim rsa As RSACryptoServiceProvider

' Path variables for source, encryption, and
' decryption folders. Must end with a backslash.
Dim EncrFolder As String = "c:\Encrypt\"
Dim DecrFolder As String = "c:\Decrypt\"
Dim SrcFolder As String = "c:\docs\"

' Public key file
Dim PubKeyFile As String = "c:\encrypt\rsaPublicKey.txt"

' Key container name for
' private/public key value pair.
Dim keyName As String = "Key01"
// Declare CspParmeters and RsaCryptoServiceProvider
// objects with global scope of your Form class.
CspParameters cspp = new CspParameters();
RSACryptoServiceProvider rsa;

// Path variables for source, encryption, and
// decryption folders. Must end with a backslash.
const string EncrFolder = @"c:\Encrypt\";
const string DecrFolder = @"c:\Decrypt\";
const string SrcFolder = @"c:\docs\";

// Public key file
const string PubKeyFile = @"c:\encrypt\rsaPublicKey.txt";

// Key container name for
// private/public key value pair.
const string keyName = "Key01";

Création d'une clé asymétrique

Cette tâche crée une clé asymétrique qui chiffre et déchiffre la clé RijndaelManaged. Cette clé a été utilisée pour chiffrer le contenu et elle affiche le nom du conteneur de clé sur le contrôle Label.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Create Keys (buttonCreateAsmKeys_Click).

Private Sub buttonCreateAsmKeys_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonCreateAsmKeys.Click
    ' Stores a key pair in the key container.
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    rsa.PersistKeyInCsp = True

    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If

End Sub
private void buttonCreateAsmKeys_Click(object sender, System.EventArgs e)
{
    // Stores a key pair in the key container.
    cspp.KeyContainerName = keyName;
    rsa = new RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;
    if (rsa.PublicOnly == true)
       label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
       label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";

}

Chiffrement d'un fichier

Cette tâche inclut deux méthodes : la méthode du gestionnaire d'événements pour le bouton Encrypt File (buttonEncryptFile_Click) et la méthode EncryptFile. La première méthode affiche une boîte de dialogue permettant de sélectionner un fichier et passe le nom du fichier à la deuxième méthode qui réalise le chiffrement.

Le contenu chiffré, la clé et le vecteur d'initialisation sont tous enregistrés dans une FileStream en tant que package de chiffrement.

La méthode EncryptFile permet de réaliser les opérations suivantes :

  1. Crée un algorithme symétrique RijndaelManaged pour chiffrer le contenu.

  2. Crée un objet RSACryptoServiceProvider pour chiffrer la clé RijndaelManaged.

  3. Utilise un objet CryptoStream pour lire et chiffrer la FileStream du fichier source, en blocs d'octets, dans un objet de destination FileStream pour le fichier chiffré.

  4. Détermine les longueurs de la clé chiffrée et du vecteur d'initialisation et crée des tableaux d'octets à partir de ces valeurs de longueur.

  5. Écrit la clé, le vecteur d'initialisation et leurs valeurs de longueur dans le package chiffré.

Le package de chiffrement utilise le format suivant :

  • Longueur de la clé, 0 - 3 octets

  • Longueur du vecteur d'initialisation, 4 - 7 octets

  • Clé chiffrée

  • Vecteur d'initialisation

  • Texte de chiffrement

Vous pouvez utiliser les longueurs de la clé et du vecteur d'initialisation pour déterminer les points de départ et les longueurs de toutes les parties du package de chiffrement et déchiffrer ainsi le fichier.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Encrypt File (buttonEncryptFile_Click).

Private Sub buttonEncryptFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonEncryptFile.Click
    If rsa Is Nothing Then
        MsgBox("Key not set.")
    Else
        ' Display a dialog box to select a file to encrypt.
        OpenFileDialog1.InitialDirectory = SrcFolder
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                Dim fName As String = OpenFileDialog1.FileName
                If (Not (fName) Is Nothing) Then
                    Dim fInfo As FileInfo = New FileInfo(fName)
                    ' Use just the file name without path.
                    Dim name As String = fInfo.Name
                    EncryptFile(name)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End If
End Sub
private void buttonEncryptFile_Click(object sender, System.EventArgs e)
{
    if (rsa == null)
        MessageBox.Show("Key not set.");
    else
    {

        // Display a dialog box to select a file to encrypt.
        openFileDialog1.InitialDirectory = SrcFolder;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fName = openFileDialog1.FileName;
            if (fName != null)
            {
                FileInfo fInfo = new FileInfo(fName);
                // Pass the file name without the path.
                string name = fInfo.Name;
                EncryptFile(name);
            }
        }
    }
}

Ajoutez la méthode EncryptFile suivante au formulaire.

Private Sub EncryptFile(ByVal inFile As String)

    ' Create instance of Rijndael for
    ' symetric encryption of the data.
    Dim rjndl As RijndaelManaged = New RijndaelManaged
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC
    Dim transform As ICryptoTransform = rjndl.CreateEncryptor

    ' Use RSACryptoServiceProvider to 
    ' enrypt the Rijndael key.
    Dim keyEncrypted() As Byte = rsa.Encrypt(rjndl.Key, False)

    ' Create byte arrays to contain
    ' the length values of the key and IV.
    Dim LenK() As Byte = New Byte((4) - 1) {}
    Dim LenIV() As Byte = New Byte((4) - 1) {}
    Dim lKey As Integer = keyEncrypted.Length
    LenK = BitConverter.GetBytes(lKey)
    Dim lIV As Integer = rjndl.IV.Length
    LenIV = BitConverter.GetBytes(lIV)

    ' Write the following to the FileStream
    ' for the encrypted file (outFs):
    ' - length of the key
    ' - length of the IV
    ' - ecrypted key
    ' - the IV
    ' - the encrypted cipher content
    ' Change the file's extension to ".enc"

    Dim outFile As String = (EncrFolder _
                + (inFile.Substring(0, inFile.LastIndexOf(".")) + ".enc"))

    Using outFs As FileStream = New FileStream(outFile, FileMode.Create)

        outFs.Write(LenK, 0, 4)
        outFs.Write(LenIV, 0, 4)
        outFs.Write(keyEncrypted, 0, lKey)
        outFs.Write(rjndl.IV, 0, lIV)

        ' Now write the cipher text using
        ' a CryptoStream for encrypting.
        Using outStreamEncrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
            ' By encrypting a chunk at
            ' a time, you can save memory
            ' and accommodate large files.
            Dim count As Integer = 0
            Dim offset As Integer = 0

            ' blockSizeBytes can be any arbitrary size.
            Dim blockSizeBytes As Integer = (rjndl.BlockSize / 8)
            Dim data() As Byte = New Byte((blockSizeBytes) - 1) {}
            Dim bytesRead As Integer = 0
            Using inFs As FileStream = New FileStream(inFile, FileMode.Open)
                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset = (offset + count)
                    outStreamEncrypted.Write(data, 0, count)
                    bytesRead = (bytesRead + blockSizeBytes)
                Loop Until (count = 0)

                outStreamEncrypted.FlushFinalBlock()
                inFs.Close()
            End Using
            outStreamEncrypted.Close()
        End Using
        outFs.Close()
    End Using
End Sub
private void EncryptFile(string inFile)
{

    // Create instance of Rijndael for
    // symetric encryption of the data.
    RijndaelManaged rjndl = new RijndaelManaged();
    rjndl.KeySize = 256;
    rjndl.BlockSize = 256;
    rjndl.Mode = CipherMode.CBC;
    ICryptoTransform transform = rjndl.CreateEncryptor();

    // Use RSACryptoServiceProvider to
    // enrypt the Rijndael key.
    byte[] keyEncrypted = rsa.Encrypt(rjndl.Key, false);

    // Create byte arrays to contain
    // the length values of the key and IV.
    byte[] LenK = new byte[4];
    byte[] LenIV = new byte[4];

    int lKey = keyEncrypted.Length;
    LenK = BitConverter.GetBytes(lKey);
    int lIV = rjndl.IV.Length;
    LenIV = BitConverter.GetBytes(lIV);

    // Write the following to the FileStream
    // for the encrypted file (outFs):
    // - length of the key
    // - length of the IV
    // - ecrypted key
    // - the IV
    // - the encrypted cipher content

   // Change the file's extension to ".enc"
    string outFile = EncrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".enc";

    using (FileStream outFs = new FileStream(outFile, FileMode.Create))
    {

            outFs.Write(LenK, 0, 4);
            outFs.Write(LenIV, 0, 4);
            outFs.Write(keyEncrypted, 0, lKey);
            outFs.Write(rjndl.IV, 0, lIV);

            // Now write the cipher text using
            // a CryptoStream for encrypting.
            using (CryptoStream outStreamEncrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
            {

                // By encrypting a chunk at
                // a time, you can save memory
                // and accommodate large files.
                int count = 0;
                int offset = 0;

                // blockSizeBytes can be any arbitrary size.
                int blockSizeBytes = rjndl.BlockSize / 8;
                byte[] data = new byte[blockSizeBytes];
                int bytesRead = 0;

                using (FileStream inFs = new FileStream(inFile, FileMode.Open))
                {
                    do
                    {
                        count = inFs.Read(data, 0, blockSizeBytes);
                        offset += count;
                        outStreamEncrypted.Write(data, 0, count);
                        bytesRead += blockSizeBytes;
                    }
                    while (count > 0);
                inFs.Close();
                }
                outStreamEncrypted.FlushFinalBlock();
                outStreamEncrypted.Close();
            }
            outFs.Close();
    }

}

Déchiffrement d'un fichier

Cette tâche inclut deux méthodes : la méthode du gestionnaire d'événements pour le bouton Decrypt File (buttonEncryptFile_Click) et la méthode DecryptFile. La première méthode affiche une boîte de dialogue permettant de sélectionner un fichier et passe le nom du fichier à la deuxième méthode qui réalise le déchiffrement.

La méthode Decrypt permet de réaliser les opérations suivantes :

  1. Crée un algorithme symétrique RijndaelManaged pour déchiffrer le contenu.

  2. Lit les huit premiers octets de la FileStream du package chiffré dans les tableaux d'octets pour obtenir les longueurs de la clé chiffrée et du vecteur d'initialisation.

  3. Extrait la clé et le vecteur d'initialisation du package de chiffrement dans les tableaux d'octets.

  4. Crée un objet RSACryptoServiceProvider pour déchiffrer la clé RijndaelManaged.

  5. Utilise un objet CryptoStream pour lire et déchiffrer la section de texte de chiffrement du package de chiffrement FileStream, en blocs d'octets, dans l'objet FileStream pour le fichier déchiffré. Une fois l'opération réalisée, le déchiffrement est terminé.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Decrypt File.

Private Sub buttonDecryptFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonDecryptFile.Click
    If rsa Is Nothing Then
        MsgBox("Key not set.")
    Else
        ' Display a dialog box to select the encrypted file.
        OpenFileDialog2.InitialDirectory = EncrFolder
        If (OpenFileDialog2.ShowDialog = Windows.Forms.DialogResult.OK) Then
            Try
                Dim fName As String = OpenFileDialog2.FileName
                If (Not (fName) Is Nothing) Then
                    Dim fi As FileInfo = New FileInfo(fName)
                    Dim name As String = fi.Name
                    DecryptFile(name)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End If
End Sub
private void buttonDecryptFile_Click(object sender, EventArgs e)
{
    if (rsa == null)
        MessageBox.Show("Key not set.");
    else
    {
        // Display a dialog box to select the encrypted file.
        openFileDialog2.InitialDirectory = EncrFolder;
        if (openFileDialog2.ShowDialog() == DialogResult.OK)
        {
            string fName = openFileDialog2.FileName;
            if (fName != null)
            {
                FileInfo fi = new FileInfo(fName);
                string name = fi.Name;
                DecryptFile(name);
            }
        }
    }
}

Ajoutez la méthode DecryptFile suivante au formulaire.

Private Sub DecryptFile(ByVal inFile As String)
    ' Create instance of Rijndael for
    ' symetric decryption of the data.
    Dim rjndl As RijndaelManaged = New RijndaelManaged
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC

    ' Create byte arrays to get the length of
    ' the encrypted key and IV.
    ' These values were stored as 4 bytes each
    ' at the beginning of the encrypted package.
    Dim LenK() As Byte = New Byte(4 - 1) {}
    Dim LenIV() As Byte = New Byte(4 - 1) {}

    ' Construct the file name for the decrypted file.
    Dim outFile As String = (DecrFolder _
                + (inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt"))

    ' Use FileStream objects to read the encrypted
    ' file (inFs) and save the decrypted file (outFs).
    Using inFs As FileStream = New FileStream((EncrFolder + inFile), FileMode.Open)

        inFs.Seek(0, SeekOrigin.Begin)
        inFs.Read(LenK, 0, 3)
        inFs.Seek(4, SeekOrigin.Begin)
        inFs.Read(LenIV, 0, 3)

        Dim lengthK As Integer = BitConverter.ToInt32(LenK, 0)
        Dim lengthIV As Integer = BitConverter.ToInt32(LenIV, 0)
        Dim startC As Integer = (lengthK + lengthIV + 8)
        Dim lenC As Integer = (CType(inFs.Length, Integer) - startC)
        Dim KeyEncrypted() As Byte = New Byte(lengthK - 1) {}
        Dim IV() As Byte = New Byte(lengthIV - 1) {}

        ' Extract the key and IV
        ' starting from index 8
        ' after the length values.
        inFs.Seek(8, SeekOrigin.Begin)
        inFs.Read(KeyEncrypted, 0, lengthK)
        inFs.Seek(8 + lengthK, SeekOrigin.Begin)
        inFs.Read(IV, 0, lengthIV)
        Dim KeyDecrypted() As Byte = rsa.Decrypt(KeyEncrypted, False)

        ' Decrypt the key.
        Dim transform As ICryptoTransform = rjndl.CreateDecryptor(KeyDecrypted, IV)

        ' Decrypt the cipher text from
        ' from the FileSteam of the encrypted
        ' file (inFs) into the FileStream
        ' for the decrypted file (outFs).
        Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
            Dim count As Integer = 0
            Dim offset As Integer = 0

            ' blockSizeBytes can be any arbitrary size.
            Dim blockSizeBytes As Integer = (rjndl.BlockSize / 8)
            Dim data() As Byte = New Byte(blockSizeBytes - 1) {}
            ' By decrypting a chunk a time,
            ' you can save memory and
            ' accommodate large files.
            ' Start at the beginning
            ' of the cipher text.
            inFs.Seek(startC, SeekOrigin.Begin)
            Using outStreamDecrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset = (offset + count)
                    outStreamDecrypted.Write(data, 0, count)
                Loop Until (count = 0)

                outStreamDecrypted.FlushFinalBlock()
                outStreamDecrypted.Close()
            End Using
            outFs.Close()
        End Using
        inFs.Close()
    End Using
End Sub
private void DecryptFile(string inFile)
{

    // Create instance of Rijndael for
    // symetric decryption of the data.
    RijndaelManaged rjndl = new RijndaelManaged();
    rjndl.KeySize = 256;
    rjndl.BlockSize = 256;
    rjndl.Mode = CipherMode.CBC;
    rjndl.Padding = PaddingMode.None;

    // Create byte arrays to get the length of
    // the encrypted key and IV.
    // These values were stored as 4 bytes each
    // at the beginning of the encrypted package.
    byte[] LenK = new byte[4];
    byte[] LenIV = new byte[4];

    // Consruct the file name for the decrypted file.
    string outFile = DecrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt";

    // Use FileStream objects to read the encrypted
    // file (inFs) and save the decrypted file (outFs).
    using (FileStream inFs = new FileStream(EncrFolder + inFile, FileMode.Open))
    {

        inFs.Seek(0, SeekOrigin.Begin);
        inFs.Seek(0, SeekOrigin.Begin);
        inFs.Read(LenK, 0, 3);
        inFs.Seek(4, SeekOrigin.Begin);
        inFs.Read(LenIV, 0, 3);

        // Convert the lengths to integer values.
        int lenK = BitConverter.ToInt32(LenK, 0);
        int lenIV = BitConverter.ToInt32(LenIV, 0);

        // Determine the start postition of
        // the ciphter text (startC)
        // and its length(lenC).
        int startC = lenK + lenIV + 8;
        int lenC = (int)inFs.Length - startC;

        // Create the byte arrays for
        // the encrypted Rijndael key,
        // the IV, and the cipher text.
        byte[] KeyEncrypted = new byte[lenK];
        byte[] IV = new byte[lenIV];

        // Extract the key and IV
        // starting from index 8
        // after the length values.
        inFs.Seek(8, SeekOrigin.Begin);
        inFs.Read(KeyEncrypted, 0, lenK);
        inFs.Seek(8 + lenK, SeekOrigin.Begin);
        inFs.Read(IV, 0, lenIV);

        // Use RSACryptoServiceProvider
        // to decrypt the Rijndael key.
        byte[] KeyDecrypted = rsa.Decrypt(KeyEncrypted, false);

        // Decrypt the key.
        ICryptoTransform transform = rjndl.CreateDecryptor(KeyDecrypted, IV);

        // Decrypt the cipher text from
        // from the FileSteam of the encrypted
        // file (inFs) into the FileStream
        // for the decrypted file (outFs).
        using (FileStream outFs = new FileStream(outFile, FileMode.Create))
        {

            int count = 0;
            int offset = 0;

            // blockSizeBytes can be any arbitrary size.
            int blockSizeBytes = rjndl.BlockSize / 8;
            byte[] data = new byte[blockSizeBytes];


            // By decrypting a chunk a time,
            // you can save memory and
            // accommodate large files.

            // Start at the beginning
            // of the cipher text.
            inFs.Seek(startC, SeekOrigin.Begin);
            using (CryptoStream outStreamDecrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
            {
                do
                {
                    count = inFs.Read(data, 0, blockSizeBytes);
                    offset += count;
                    outStreamDecrypted.Write(data, 0, count);

                }
                while (count > 0);

                outStreamDecrypted.FlushFinalBlock();
                outStreamDecrypted.Close();
            }
            outFs.Close();
        }
        inFs.Close();
    }

}

Exportation d'une clé publique

Cette tâche enregistre la clé créée par le bouton Create Keys dans un fichier. Seuls les paramètres publics sont exportés.

Cette tâche décrit le scénario selon lequel Alice confie sa clé publique à Bob afin qu'il puisse lui chiffrer des fichiers. Avec cette clé publique, ni Bob ni personne d'autre ne pourront déchiffrer les fichiers, car ils ne disposent pas de la paire de clés complète avec les paramètres privés.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Export Public Key (buttonExportPublicKey_Click).

Private Sub buttonExportPublicKey_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonExportPublicKey.Click
    ' Save the public key created by the RSA
    ' to a file. Caution, persisting the
    ' key to a file is a security risk.
    Dim sw As StreamWriter = New StreamWriter(PubKeyFile)
    sw.Write(rsa.ToXmlString(False))
    sw.Close()
End Sub
void buttonExportPublicKey_Click(object sender, System.EventArgs e)
{
    // Save the public key created by the RSA
    // to a file. Caution, persisting the
    // key to a file is a security risk.
    StreamWriter sw = new StreamWriter(PubKeyFile);
    sw.Write(rsa.ToXmlString(false));
    sw.Close();
}

Importation d'une clé publique

Cette tâche charge la clé avec les paramètres publics uniquement, telle qu'elle a été créée par le bouton Export Public Key et la définit en tant que nom du conteneur de clé.

Cette tâche décrit le scénario selon lequel Bob charge la clé d'Alice avec les paramètres publics uniquement afin qu'il puisse lui chiffrer les fichiers.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Import Public Key (buttonImportPublicKey_Click).

Private Sub buttonImportPublicKey_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonImportPublicKey.Click
    Dim sr As StreamReader = New StreamReader(PubKeyFile)
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    Dim keytxt As String = sr.ReadToEnd
    rsa.FromXmlString(keytxt)
    rsa.PersistKeyInCsp = True
    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If
    sr.Close()
End Sub
void buttonImportPublicKey_Click(object sender, System.EventArgs e)
{
    StreamReader sr = new StreamReader(PubKeyFile);
    cspp.KeyContainerName = keyName;
    rsa = new RSACryptoServiceProvider(cspp);
    string keytxt = sr.ReadToEnd();
    rsa.FromXmlString(keytxt);
    rsa.PersistKeyInCsp = true;
    if (rsa.PublicOnly == true)
        label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
        label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";
    sr.Close();
}

Obtention d'une clé privée

Cette tâche affecte le nom du conteneur de clé au nom de la clé créée à l'aide du bouton Create Keys. Le conteneur de clé contiendra la paire de clés complète avec les paramètres privés.

Cette tâche décrit le scénario selon lequel Alice utilise sa clé privée pour déchiffrer les fichiers chiffrés par Bob.

Ajoutez le code suivant comme le gestionnaire d'événements Click du bouton Get Private Key (buttonGetPrivateKey_Click).

Private Sub buttonGetPrivateKey_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles buttonGetPrivateKey.Click
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    rsa.PersistKeyInCsp = True
    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If
End Sub
private void buttonGetPrivateKey_Click(object sender, EventArgs e)
{
    cspp.KeyContainerName = keyName;

    rsa = new RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;

    if (rsa.PublicOnly == true)
        label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
        label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";

}

Test de l'application

Après avoir généré l'application, exécutez les scénarios de test suivants.

Pour créer des clés, chiffrer et déchiffrer

  1. Cliquez sur le bouton Create Keys. L'étiquette affiche le nom de la clé indiquant qu'il s'agit d'une paire de clés complète.

  2. Cliquez sur le bouton Export Public Key. Notez que l'exportation des paramètres de la clé publique ne modifie pas la clé actuelle.

  3. Cliquez sur le bouton Encrypt File et sélectionnez un fichier.

  4. Cliquez sur le bouton Decrypt File et sélectionnez le fichier chiffré.

  5. Examinez le fichier déchiffré.

  6. Fermez et redémarrez l'application pour tester la récupération des conteneurs de clé persistants dans le scénario suivant.

Pour chiffrer à l'aide de la clé publique

  1. Cliquez sur le bouton Import Public Key. L'étiquette affiche le nom de la clé qui est publique uniquement.

  2. Cliquez sur le bouton Encrypt File et sélectionnez un fichier.

  3. Cliquez sur le bouton Decrypt File et sélectionnez le fichier chiffré. Cette opération échoue, car vous devez disposer de la clé privée pour le déchiffrement.

Dans ce scénario, seule la clé publique est disponible pour chiffrer un fichier pour une autre personne. En général, cette personne transmet uniquement la clé publique et conserve la clé privée pour le déchiffrement.

Pour déchiffrer à l'aide de la clé privée

  1. Cliquez sur le bouton Get Private Key. L'étiquette affiche le nom de la clé et indique s'il s'agit de la paire de clés complète.

  2. Cliquez sur le bouton Decrypt File et sélectionnez le fichier chiffré. Cette opération réussit, car vous disposez de la paire de clés complète pour le déchiffrement.

Voir aussi

Autres ressources

Tâches de chiffrement

Services de chiffrement