![]() |
![]() |
|
|
||||||||
|
||||||||
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 |
| Chiffrement symétrique (à clé secrète) |
| Chiffrement asymétrique (à clé privée) |
| 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 |
|
Dim wCryptoStream As New CryptoStream(wDestination, wEncryptor, Security.Cryptography.CryptoStreamMode.Write) REM Préparation du buffer
de lecture 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() |
|
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ù TrySystem.IO.File.Delete(wFichierDestination) Catch ex As Exception End Try REM Utilisation de l'algo
RC2 REM Préparation de la clé
et du vecteur d'initialisation REM Ouverture du fichier
source 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 wDecryptor As System.Security.Cryptography.ICryptoTransform = wRC2.CreateDecryptor() REM Destruction du fichier de destination au cas où TrySystem.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.Close() 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.
|
|