Partager via


Décryptage de données

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

Décryptage symétrique

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

L'exemple suivant illustre la manière de créer une nouvelle instance de la classe RijndaelManaged et comment l'utiliser pour effectuer un décryptage 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 la même clé et vecteur d'initialisation utilisés pour le cryptage, 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)
[C#]
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écryptage 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écrypté à 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é soit transférées en toute sécurité, soit ont fait l'objet d'un accord précédent. Il ne montre pas le code nécessaire pour crypter et transférer ces valeurs.

Imports System
Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
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() = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}
        Dim IV As Byte() = {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.
            Dim TCPListen As New TcpListener(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
[C#]
using System;
using System.Net.Sockets;
using System.Threading;
using System.IO;
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(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 cryptée doit être effectuée auprès de l'écouteur. La connexion doit utiliser la même clé, vecteur d'initialisation et algorithme utilisés dans l'écouteur. Si cette connexion a lieu, le message est décrypté et affiché sur la console.

Décryptage asymétrique

Toute personne qui génère une paire de clés publique/privée effectue généralement un décryptage asymétrique. Vous pouvez décrypter des données à l'aide de RSACryptoServiceProvider que vous utilisez pour créer la paire de clés publique/privée ou pour initialiser un nouveau RSACryptoServiceProvider à l'aide des informations sur les clés. Le décryptage ne fonctionne que si vous utilisez la clé privée qui correspond à la clé publique utilisée pour crypter les données.

L'exemple suivant illustre le décryptage de deux tableaux d'octets qui représentent une clé et un vecteur d'initialisation symétriques.

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

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

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

Voir aussi

Génération de clés pour le cryptage et le décryptage | Cryptage de données | Tâches cryptographiques Services cryptographiques