Comment chiffrer (crypter) un fichier ?
Auteur Stéphane Sibué
Date Décembre 2007

Le Compact Framework 2 inclut en standard des classes permettant de chiffrer les données. Ces classes sont toutes "rangées" dans l'espace de nom System.Security.Cryptography.

Le Compact Framework 2 propose plusieurs algorithmes de chiffrement symétriques et asymétriques.

Chiffrer : Définition

Chiffrer (ou crypter) : Action d'effectuer une transformation des données afin que celles-ci ne soient lues par des tiers.

Chiffrement symétrique (à clé secrète)

Ce type de chiffrement utilise une clé secrète, de partage unique, pour chiffrer et déchiffrer les données.

Algorithmes disponibles dans le CF2 : DES / RC2 / AES / Triple DES

Chiffrement asymétrique (à clé privée)

Ce type de chiffrement utilise une paire de clés publique/privée à partage unique pour chiffrer et déchiffrer  les données.

Algorithmes disponibles dans le CF2 : DSA / RSA

Utilisation de l'algorithme RC2 pour chiffrer

Nous allons utiliser l'algorithme RC2 pour chiffrer le contenu d'un fichier. L'idée de cet exemple et de prendre un fichier (fichier source), et de créer un autre fichier qui contiendra les données du fichier source chiffrées (fichier destination).

Pour chiffrer des données avec RC2 il est nécessaire de définir une clé et d'utiliser un vecteur d'initialisation. Ces deux informations devront être utilisées à l'identique pour déchiffrer les données. Ainsi, pendant le déchiffrement, si la clé ou le vecteur ne sont pas absolument identiques à ceux utilisés pendant le chiffrement, les données ne seront pas récupérables.

Dans le code, la première chose à faire est de déclarer un objet de type RC2CryptoServiceProvider (ne pas oublier d'importer l'espace de noms System.Security.Cryptography).

REM Utilisation de l'algo RC2
Dim wRC2 As New RC2CryptoServiceProvider

RC2 utilise une clé dont la taille peut varier de 40 à 128 bits. La clé doit être fournie au provider sous la forme d'un tableau d'octets :

REM La taille de la clé peut varier de 40 à 128 bits (5 à 16 caractères)
REM Par défaut, la clé fait 128 bits
REM Dans cet exemple, la clé est la chaîne "CeciESTLaCle568" qui fait 16 caractères

wRC2.Key = System.Text.Encoding.Default.GetBytes(
"CeciESTLaCle568")

Il faut ensuite définir un vecteur d'initialisation :

REM Dans cet exemple, on crée un vecteur d'initialisation personnalisé
REM Il doit avoir la taille de la proprité BlockSize
REM Par défaut BlocSize=64 bits soit 8 octets
Dim wIV() As Byte = {&H56, &HFE, &HA7, &H89, &H5, &H1A, &HCB, &H5F}
wRC2.IV = wIV

Une fois ces deux opérations effectuées, il faut créer l'encrypteur correspondant :

Dim wEncryptor As ICryptoTransform
wEncryptor = wRC2.CreateEncryptor()

Il faut ensuite ouvrir le fichier source (celui que l'on veut chiffrer) et le fichier destination (qui recevra le contenu chiffré). Dans l'exemple, les variables wFichierSource et wFichierDestination sont des chaînes de caractères contenant respectivement le chemin de chacun des deux fichiers.

En cas de problème lors de l'ouverture du fichier source ou lors de la création du fichier destination, le code sort en retournant la valeur booléenne False (gestion des erreurs réduite à sa plus simple expression).

REM Ouverture du fichier source

Dim wSource As FileStream = Nothing

Try
    wSource =
New FileStream(wFichierSource, FileMode.Open)
Catch ex As Exception
   
Return False
End
Try

REM Ouverture du fichier de destination

Dim wDestination As FileStream = Nothing

Try
    wDestination =
New FileStream(wFichierDestination, FileMode.Create)
Catch ex As Exception
    wSource.Close()
    Return False
End
Try


Le principe est de lire les données, de les faire passer dans l'encrypteur pour les chiffrer à la volée, puis d'écrire les données chiffrées dans le fichier de sortie. En fait, l'encrypteur est placé juste avant le flux de sortie.

Il faut utiliser un objet de type CryptoStream pour réaliser l'opération de chiffrement à la volée. Cet objet prend en paramètre le flux de sortie à utiliser, l'encrypteur chargé de chiffrer les données, et l'opération à réaliser une fois les données chiffrées (dans notre cas, l'écriture dans le flux de destination) :

Dim wCryptoStream As New CryptoStream(wDestination, wEncryptor, Security.Cryptography.CryptoStreamMode.Write)

REM Préparation du buffer de lecture
Dim wSourceBytes(wSource.Length - 1) As Byte

REM Lecture du fichier source
wSource.Read(wSourceBytes, 0, wSource.Length)

REM Cryptage de la source
wCryptoStream.Write(wSourceBytes, 0, wSourceBytes.Length)
wCryptoStream.FlushFinalBlock()

REM Fermeture des différents flux
wCryptoStream.Close()
wSource.Close()
wDestination.Close()


Voilà, les données du fichier sources sont maintenant dans le fichier de destination, chiffrées.

Voici le code source complet de la fonction de chiffrement :

Private Function Crypter(ByVal wFichierSource As String, ByVal wFichierDestination As String, ByVal wDeleteSource As Boolean) As Boolean

    Cursor.Current = Cursors.WaitCursor

    REM On détruit le fichier de destination au cas où

    Try
        System.IO.File.Delete(wFichierDestination)
   
Catch ex As Exception
   
End Try

    REM Utilisation de l'algo RC2
    Dim
wRC2 As New RC2CryptoServiceProvider

    REM Préparation de la clé et du vecteur d'initialisation
    wRC2.Key = System.Text.Encoding.Default.GetBytes(
"CeciESTLaCle568")
    Dim wIV() As Byte = {&H56, &HFE, &HA7, &H89, &H5, &H1A, &HCB, &H5F}
    wRC2.IV = wIV

    Dim wEncryptor As ICryptoTransform = wRC2.CreateEncryptor()

    REM Ouverture du fichier source
    Dim wSource As FileStream = Nothing
    Try

        wSource =
New FileStream(wFichierSource, FileMode.Open)
    Catch ex As Exception
        Return False
    End
Try

    REM Ouverture du fichier de destination
    Dim wDestination As FileStream = Nothing
    Try

        wDestination =
New FileStream(wFichierDestination, FileMode.Create)
    Catch ex As Exception
        wSource.Close()

        Return
False
    End
Try

    Dim wCryptoStream As New CryptoStream(wDestination, wEncryptor, Security.Cryptography.CryptoStreamMode.Write)

    REM Préparation du buffer de lecture
    Dim wSourceBytes(wSource.Length - 1) As Byte

    REM Lecture du fichier source
    wSource.Read(wSourceBytes, 0, wSource.Length)

    REM Cryptage de la source
    wCryptoStream.Write(wSourceBytes, 0, wSourceBytes.Length)
    wCryptoStream.FlushFinalBlock()

    REM Fermeture des différents flux
    wCryptoStream.Close()
    wSource.Close()
    wDestination.Close()

    REM S'il le faut on détruit la source
    If wDeleteSource Then
        Try

            System.IO.File.Delete(wFichierSource)
   
    Catch ex As Exception
            MsgBox(
String.Format("Impossible de dtruire la source {0}", Path.GetFileName(wFichierSource)), MsgBoxStyle.Information)
        End Try
    End
If

    Cursor.Current = Cursors.Default

    Return True

End Function


Et maintenant, on fait l'opération inverse pour déchiffrer

Je vous livre directement le code qui permet de déchiffrer le contenu d'un fichier :

Private Function Decrypter(ByVal wFichierSource As String, ByVal wFichierDestination As String, ByVal wDeleteSource As Boolean) As Boolean

    Dim wRC2 As New RC2CryptoServiceProvider()

    REM On définit la clé et le vecteur d'initialisation

    wRC2.Key = System.Text.Encoding.Default.GetBytes("CeciESTLaCle568")
    Dim
wIV() As Byte = {&H56, &HFE, &HA7, &H89, &H5, &H1A, &HCB, &H5F}
    wRC2.IV = wIV

    Dim wDecryptor As System.Security.Cryptography.ICryptoTransform = wRC2.CreateDecryptor()

    REM Destruction du fichier de destination au cas où

    Try
        System.IO.File.Delete(wFichierDestination)
   
Catch ex As Exception
   
End Try

    REM Ouverture du fichier source
    Dim wSource As FileStream = Nothing
    Try

        wSource =
New FileStream(wFichierSource, FileMode.Open)
   
Catch ex As Exception
       
Return False
    End
Try

    REM Ouverture du fichier destination
    Dim wDestination As FileStream = Nothing
    Try

        wDestination =
New FileStream(wFichierDestination, FileMode.Create)
    Catch ex As Exception
        Return False
    End
Try

    Dim wCryptoStream As New System.Security.Cryptography.CryptoStream(wDestination, wDecryptor, Security.Cryptography.CryptoStreamMode.Write)

    Dim wSourceBytes(wSource.Length - 1) As Byte

    wSource.Read(wSourceBytes, 0, wSourceBytes.Length)

    wCryptoStream.Write(wSourceBytes, 0, wSourceBytes.Length)
    wCryptoStream.FlushFinalBlock()

    wCryptoStream.Close()
    wSource.Close()
    wDestination.Close()

    REM S'il le faut on détruit la source
    If wDeleteSource Then
        Try

            System.IO.File.Delete(wFichierSource)
        Catch ex As Exception
            MsgBox(
String.Format("Impossible de dtruire la source {0}", Path.GetFileName(wFichierSource)), MsgBoxStyle.Information)
        End Try
    End
If

    Cursor.Current = Cursors.Default

    Return True

End Function

Voilà, maintenant vous avez les bases pour crypter des fichiers.

Stéphane Sibué


Développez pour Windows Mobile
Copyright 2001-2007 - Tous droits réservés
Toutes les marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.