Déchiffrement de données

Le déchiffrement est l'opération inverse du chiffrement. Pour le chiffrement à clé secrète, vous devez connaître la clé et le vecteur d'initialisation qui ont été utilisés pour chiffrer les données. Pour le chiffrement à clé publique, vous devez connaître soit la clé publique (si les données ont été chiffrées à l'aide de la clé privée), soit la clé privée (si les données ont été chiffrées à l'aide de la clé publique).

Déchiffrement symétrique

Le déchiffrement de données chiffrées à l'aide d'algorithmes symétriques est similaire au processus utilisé pour chiffrer des données à l'aide d'algorithmes symétriques. La classe CryptoStream est utilisée avec les classes de chiffrement symétrique fournies par le .NET Framework pour déchiffrer des données lues à partir de n'importe quel objet de flux de données managé.

L'exemple suivant explique comment créer une nouvelle instance de la classe RijndaelManaged et comment l'utiliser pour effectuer un déchiffrement sur un objet CryptoStream. Cet exemple crée d'abord une nouvelle instance de la classe RijndaelManaged. Puis il crée un objet CryptoStream et l'initialise en lui donnant la valeur d'un flux managé nommé MyStream. Ensuite, la méthode CreateDecryptor de la classe RijndaelManaged reçoit les mêmes clé et vecteur d'initialisation utilisés pour le chiffrement, puis est passée au constructeur CryptoStream. Finalement, l'énumération CryptoStreamMode est passée au constructeur CryptoStream pour spécifier l'accès en lecture au flux.

Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateDecryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Read)
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read);

L'exemple suivant montre l'ensemble du processus de création d'un flux, de déchiffrement de flux, de lecture du flux et de fermeture des flux. Un objet TCPListener qui initialise un flux de réseau est créé lorsqu'une connexion à l'objet qui écoute est faite. Le flux de réseau est ensuite déchiffré à l'aide de la classe CryptoStream et de la classe RijndaelManaged. Cet exemple présuppose que les valeurs de la clé et du vecteur d'initialisation ont été transférées avec succès ou ont fait l'objet d'un accord précédent. Il ne montre pas le code nécessaire pour chiffrer et transférer ces valeurs.

Imports System
Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System.Net
Imports System.Security.Cryptography

Module Module1
    Sub Main()
            'The key and IV must be the same values that were used
            'to encrypt the stream.  
            Dim Key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
            Dim IV As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
        Try
            'Initialize a TCPListener on port 11000
            'using the current IP address.
            Dim TCPListen As New TcpListener(IPAddress.Any, 11000)

            'Start the listener.
            TCPListen.Start()

            'Check for a connection every five seconds.
            While Not TCPListen.Pending()
                Console.WriteLine("Still listening. Will try in 5 seconds.")

                Thread.Sleep(5000)
            End While

            'Accept the client if one is found.
            Dim TCP As TcpClient = TCPListen.AcceptTcpClient()

            'Create a network stream from the connection.
            Dim NetStream As NetworkStream = TCP.GetStream()

            'Create a new instance of the RijndaelManaged class
            'and decrypt the stream.
            Dim RMCrypto As New RijndaelManaged()


            'Create an instance of the CryptoStream class, pass it the NetworkStream, and decrypt 
            'it with the Rijndael class using the key and IV.
            Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read)

            'Read the stream.
            Dim SReader As New StreamReader(CryptStream)

            'Display the message.
            Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd())

            'Close the streams.
            SReader.Close()
            NetStream.Close()
            TCP.Close()
            'Catch any exceptions. 
        Catch
            Console.WriteLine("The Listener Failed.")
        End Try
    End Sub
End Module
using System;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net;
using System.Security.Cryptography;

class Class1
{
   static void Main(string[] args)
   {
      //The key and IV must be the same values that were used
      //to encrypt the stream.  
      byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
      byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
      try
      {
         //Initialize a TCPListener on port 11000
         //using the current IP address.
         TcpListener TCPListen = new TcpListener(IPAdress.Any, 11000);

         //Start the listener.
         TCPListen.Start();

         //Check for a connection every five seconds.
         while(!TCPListen.Pending())
         {
            Console.WriteLine("Still listening. Will try in 5 seconds.");
            Thread.Sleep(5000);
         }

         //Accept the client if one is found.
         TcpClient TCP = TCPListen.AcceptTcpClient();

         //Create a network stream from the connection.
         NetworkStream NetStream = TCP.GetStream();

         //Create a new instance of the RijndaelManaged class
         // and decrypt the stream.
         RijndaelManaged RMCrypto = new RijndaelManaged();


         //Create a CryptoStream, pass it the NetworkStream, and decrypt 
         //it with the Rijndael class using the key and IV.
         CryptoStream CryptStream = new CryptoStream(NetStream, 
            RMCrypto.CreateDecryptor(Key, IV), 
            CryptoStreamMode.Read);

         //Read the stream.
         StreamReader SReader = new StreamReader(CryptStream);

         //Display the message.
         Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd());

         //Close the streams.
         SReader.Close();
         NetStream.Close();
         TCP.Close();
      }
      //Catch any exceptions. 
      catch
      {
         Console.WriteLine("The Listener Failed.");
      }
   }
}

Pour que l'exemple précédent fonctionne, une connexion chiffrée doit être effectuée auprès de l'écouteur. La connexion doit utiliser les mêmes clé, vecteur d'initialisation et algorithme utilisés dans l'écouteur. Si cette connexion a lieu, le message est déchiffré et affiché dans la console.

Déchiffrement asymétrique

En général, un correspondant (correspondant A) génère à la fois une clé publique et une clé privée et stocke l'une d'entre elles en mémoire ou dans un conteneur de clé de chiffrement. Le correspondant A envoie ensuite la clé publique à un autre correspondant (correspondant B). À l'aide de la clé publique, le correspondant B chiffre des données et renvoie ces données au correspondant A. Après avoir reçu les données, le correspondant A les déchiffre à l'aide de la clé privée correspondante. Le déchiffrement ne fonctionne que si le correspondant A utilise la clé privée qui correspond à la clé publique utilisée par le correspondant B pour chiffrer les données.

Pour plus d'informations sur la façon de stocker une clé asymétrique dans un conteneur de clé de chiffrement sécurisé, puis de récupérer la clé asymétrique, consultez Comment : stocker des clés asymétriques dans un conteneur de clé.

L'exemple suivant illustre le déchiffrement de deux tableaux d'octets qui représentent une clé et un vecteur d'initialisation symétriques. Pour plus d'informations sur l'extraction de la clé publique asymétrique de l'objet RSACryptoServiceProvider dans un format que vous pouvez facilement envoyer à un tiers, consultez Chiffrement de données.

'Create a new instance of the RSACryptoServiceProvider class.
Dim RSA As New RSACryptoServiceProvider()

' Export the public key information and send it to a third party.
' Wait for the third party to encrypt some data and send it back.

'Decrypt the symmetric key and IV.
SymmetricKey = RSA.Decrypt(EncryptedSymmetricKey, False)
SymmetricIV = RSA.Decrypt(EncryptedSymmetricIV, False)
//Create a new instance of the RSACryptoServiceProvider class.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

// Export the public key information and send it to a third party.
// Wait for the third party to encrypt some data and send it back.

//Decrypt the symmetric key and IV.
SymmetricKey = RSA.Decrypt( EncryptedSymmetricKey, false);
SymmetricIV = RSA.Decrypt( EncryptedSymmetricIV , false);

Voir aussi

Concepts

Génération de clés pour le chiffrement et le déchiffrement

Chiffrement de données

Services de chiffrement

Autres ressources

Tâches de chiffrement