Partager via


Cryptage de données

Le cryptage symétrique et le cryptage asymétrique s'effectuent à l'aide de processus différents. Le cryptage symétrique s'effectue sur des flux et s'avère ainsi utile pour crypter de grandes quantités de données. Le cryptage asymétrique s'effectue sur un petit nombre d'octets. Il est par conséquent utile uniquement pour des petites quantités de données.

Cryptage symétrique

Les classes de cryptographie symétrique managées sont utilisées à l'aide d'une classe de flux spéciale nommée CryptoStream qui crypte les données lues dans le flux. La classe CryptoStream est initialisée avec une classe de flux managée, une classe implémente l'interface ICryptoTransform (créée à partir d'une classe qui implémente un algorithme cryptographique) et une énumération CryptoStreamMode qui décrit le type d'accès autorisé à la classe CryptoStream. La classe CryptoStream peut être initialisée à l'aide de n'importe quelle classe qui dérive de la classe Stream, y compris FileStream, MemoryStream, et NetworkStream. À l'aide de ces classes, vous pouvez effectuer un cryptage symétrique sur une variété d'objets de flux.

L'exemple suivant illustre la manière de créer une nouvelle instance de la classe RijndaelManaged qui implémente l'algorithme de cryptage de Rijndael et l'utilise pour effectuer un cryptage sur une classe CryptoStream. Dans cet exemple, la classe CryptoStream est initialisée avec l'objet de flux nommé MyStream qui peut être n'importe quel type de flux managé. La méthode CreateEncryptor de la classe RijndaelManaged reçoit la clé et le vecteur d'initialisation utilisés pour le cryptage. Dans ce cas, la clé et le vecteur d'initialisation par défaut générés à partir de RMCrypto sont utilisés. Enfin, CryptoStreamMode.Write est passé et spécifie un accès en écriture au flux.

Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateEncryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Write)
[C#]
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateEncryptor(), CryptoStreamMode.Write);

Après l'exécution de ce code, toutes les données écrites dans l'objet CryptoStream sont cryptées à l'aide de l'algorithme de Rijndael.

L'exemple suivant montre l'ensemble du processus de création d'un flux, de cryptage de flux, d'écriture dans le flux et de fermeture du flux. Cet exemple crée un flux de réseau qui est crypté à l'aide de la classe CryptoStream et de la classe RijndaelManaged. Un message est écrit dans le flux crypté à l'aide de la classe StreamWriter.

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

Module Module1
Sub Main()
   Try
      'Create a TCP connection to a listening TCP process.
      'Use "localhost" to specify the current computer or
      'replace "localhost" with the IP address of the 
      'listening process. 
      Dim TCP As New TcpClient("localhost", 11000)

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

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

      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}

      'Create a CryptoStream, pass it the NetworkStream, and encrypt 
      'it with the Rijndael class.
      Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Write)

      'Create a StreamWriter for easy writing to the 
      'network stream.
      Dim SWriter As New StreamWriter(CryptStream)

      'Write to the stream.
      SWriter.WriteLine("Hello World!")

      'Inform the user that the message was written
      'to the stream.
      Console.WriteLine("The message was sent.")

      'Close all the connections.
      SWriter.Close()
      CryptStream.Close()
      NetStream.Close()
      TCP.Close()
   Catch
      'Inform the user that an exception was raised.
      Console.WriteLine("The connection failed.")
   End Try
End Sub
End Module
[C#]
using System;
using System.IO;
using System.Security.Cryptography;
using System.Net.Sockets;
 
public class main
{
   public static void Main(string[] args)
   {
      try
      {
         //Create a TCP connection to a listening TCP process.
         //Use "localhost" to specify the current computer or
         //replace "localhost" with the IP address of the 
         //listening process.  
         TcpClient TCP = new TcpClient("localhost",11000);
   
         //Create a network stream from the TCP connection. 
         NetworkStream NetStream = TCP.GetStream();

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

         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};

         //Create a CryptoStream, pass it the NetworkStream, and encrypt 
         //it with the Rijndael class.
         CryptoStream CryptStream = new CryptoStream(NetStream, 
         RMCrypto.CreateEncryptor(Key, IV),   
         CryptoStreamMode.Write);

         //Create a StreamWriter for easy writing to the 
         //network stream.
         StreamWriter SWriter = new StreamWriter(CryptStream);

         //Write to the stream.
         SWriter.WriteLine("Hello World!");

         //Inform the user that the message was written
         //to the stream.
         Console.WriteLine("The message was sent.");

         //Close all the connections.
         SWriter.Close();
         CryptStream.Close();
         NetStream.Close();
         TCP.Close();
      }
      catch
      {
         //Inform the user that an exception was raised.
         Console.WriteLine("The connection failed.");
      }
   }
}

Pour que l'exemple précédent s'exécute correctement, un processus à l'écoute sur le numéro de port et l'adresse IP spécifiés dans la classe TCPClient est nécessaire. Si un processus d'écoute existe, le code se connecte à ce processus, crypte le flux à l'aide de l'algorithme symétrique de Rijndael, puis écrit « Hello World » dans le flux. Si le code fonctionne, il affiche le texte suivant sur la console :

The message was sent.

Cependant, si aucun processus d'écoute n'est trouvé ou si une exception est levée, le code affiche le texte suivant sur la console :

The connection failed.

Cryptage asymétrique

Les algorithmes asymétriques sont habituellement utilisés pour crypter de petites quantités de données telles que le cryptage d'une clé et d'un vecteur d'initialisation symétriques. Généralement, un individu effectuant un cryptage asymétrique utilise la clé publique générée par une autre partie. La classe RSACryptoServiceProvider est fournie par le .NET Framework à cette fin.

L'exemple suivant utilise des informations de clé publique pour crypter une clé et un vecteur d'initialisation symétriques. Deux tableaux d'octets sont initialisés qui représentent la clé publique d'un tiers. Un objet RSAParameters est initialisé à ces valeurs. Puis, l'objet RSAParameters (ainsi que la clé publique qu'il représente) est importé dans RSACryptoServiceProvider à l'aide de la méthode RSACryptoServiceProvider.ImportParameters. Enfin, la clé privée et le vecteur d'initialisation créés par une classe RijndaelManaged sont cryptés. Cet exemple nécessite des systèmes équipés de cryptage à 128 bits.

Imports System
Imports System.Security.Cryptography

Module Module1

    Sub Main()
        'Initialize the byte arrays to the public key information.
      Dim PublicKey As Byte() =  {214, 46, 220, 83, 160, 73, 40, 39, 201, 155, 19,202, 3, 11, 191, 178, 56, 74, 90, 36, 248, 103, 18, 144, 170, 163, 145, 87, 54, 61, 34, 220, 222, 207, 137, 149, 173, 14, 92, 120, 206, 222, 158, 28, 40, 24, 30, 16, 175, 108, 128, 35, 230, 118, 40, 121, 113, 125, 216, 130, 11, 24, 90, 48, 194, 240, 105, 44, 76, 34, 57, 249, 228, 125, 80, 38, 9, 136, 29, 117, 207, 139, 168, 181, 85, 137, 126, 10, 126, 242, 120, 247, 121, 8, 100, 12, 201, 171, 38, 226, 193, 180, 190, 117, 177, 87, 143, 242, 213, 11, 44, 180, 113, 93, 106, 99, 179, 68, 175, 211, 164, 116, 64, 148, 226, 254, 172, 147}

        Dim Exponent As Byte() = {1, 0, 1}

        'Create values to store encrypted symmetric keys.
        Dim EncryptedSymmetricKey() As Byte
        Dim EncryptedSymmetricIV() As Byte

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

        'Create a new instance of the RSAParameters structure.
        Dim RSAKeyInfo As New RSAParameters()

        'Set RSAKeyInfo to the public key values. 
        RSAKeyInfo.Modulus = PublicKey
        RSAKeyInfo.Exponent = Exponent

        'Import key parameters into RSA.
        RSA.ImportParameters(RSAKeyInfo)

        'Create a new instance of the RijndaelManaged class.
        Dim RM As New RijndaelManaged()

        'Encrypt the symmetric key and IV.
        EncryptedSymmetricKey = RSA.Encrypt(RM.Key, False)
        EncryptedSymmetricIV = RSA.Encrypt(RM.IV, False)
    End Sub

End Module
[C#]
using System;
using System.Security.Cryptography;

class Class1
{
   static void Main()
   {
      //Initialize the byte arrays to the public key information.
      byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
            74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
            207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
            108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
            240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
            168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
            38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
            106,99,179,68,175,211,164,116,64,148,226,254,172,147};

      byte[] Exponent = {1,0,1};
      
      //Create values to store encrypted symmetric keys.
      byte[] EncryptedSymmetricKey;
      byte[] EncryptedSymmetricIV;

      //Create a new instance of the RSACryptoServiceProvider class.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create a new instance of the RSAParameters structure.
      RSAParameters RSAKeyInfo = new RSAParameters();

      //Set RSAKeyInfo to the public key values. 
      RSAKeyInfo.Modulus = PublicKey;
      RSAKeyInfo.Exponent = Exponent;

      //Import key parameters into RSA.
      RSA.ImportParameters(RSAKeyInfo);

      //Create a new instance of the RijndaelManaged class.
      RijndaelManaged RM = new RijndaelManaged();

      //Encrypt the symmetric key and IV.
      EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
      EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);
   }
}

Voir aussi

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