Problème de Déchiffrement de Fichiers

HU0 Messages postés 2 Date d'inscription dimanche 10 septembre 2023 Statut Membre Dernière intervention 10 septembre 2023 - Modifié le 10 sept. 2023 à 11:19
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 - 15 sept. 2023 à 09:49

Salut à tous,

J'ai récemment rencontré un problème avec un programme que j'ai développé en utilisant VB.NET pour chiffrer et déchiffrer des fichiers à l'aide de l'algorithme AES-128. Le chiffrement fonctionne correctement, mais le déchiffrement semble être problématique lorsque j'utilise des clés différentes.

Voici comment fonctionne mon programme :

  1. Je chiffre un dossier entier de fichiers à l'aide d'une clé de chiffrement.
  2. Plus tard, je tente de déchiffrer ce dossier en utilisant une clé de déchiffrement différente.

Le problème est que le déchiffrement réussit même lorsque j'utilise des clés de chiffrement et de déchiffrement différentes, ce qui ne devrait pas être le cas. Normalement, avec des clés différentes, le déchiffrement devrait échouer.

Informations supplémentaires :

  • Plateforme : Windows 11
  • Algorithme de chiffrement : AES-128
  • Langage de programmation : VB.NET

Voici le code que j'utilise :

Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1

    Public Shared Sub Encrypt(ByVal inputFile As String, ByVal outputFile As String, ByVal key As String)
        Dim aesAlg As New AesCryptoServiceProvider()
        aesAlg.KeySize = 128
        aesAlg.BlockSize = 128
        aesAlg.Mode = CipherMode.CFB

        ' Vous devez vous assurer que la clé a la longueur correcte (16 octets)
        Dim keyBytes As Byte() = Encoding.UTF8.GetBytes(key)
        Array.Resize(keyBytes, 16)
        aesAlg.Key = keyBytes

        ' Générez un IV aléatoire
        aesAlg.GenerateIV()

        Using encryptor As ICryptoTransform = aesAlg.CreateEncryptor()
            Using fsInput As New FileStream(inputFile, FileMode.Open)
                Using fsEncrypted As New FileStream(outputFile, FileMode.Create)
                    ' Écrivez l'IV dans le fichier chiffré (les 16 premiers octets)
                    fsEncrypted.Write(aesAlg.IV, 0, aesAlg.IV.Length)

                    Using cryptoStream As New CryptoStream(fsEncrypted, encryptor, CryptoStreamMode.Write)
                        Dim buffer(4096) As Byte
                        Dim bytesRead As Integer

                        Do
                            bytesRead = fsInput.Read(buffer, 0, buffer.Length)
                            If bytesRead > 0 Then
                                cryptoStream.Write(buffer, 0, bytesRead)
                            End If
                        Loop While bytesRead > 0
                    End Using
                End Using
            End Using
        End Using
    End Sub


    Public Shared Sub Decrypt(ByVal inputFile As String, ByVal outputFile As String, ByVal key As String)
        Dim aesAlg As New AesCryptoServiceProvider()
        aesAlg.KeySize = 128
        aesAlg.BlockSize = 128
        aesAlg.Mode = CipherMode.CFB

        ' Vous devez vous assurer que la clé a la longueur correcte (16 octets)
        Dim keyBytes As Byte() = Encoding.UTF8.GetBytes(key)
        Array.Resize(keyBytes, 16)
        aesAlg.Key = keyBytes

        ' Lisez l'IV du fichier chiffré
        Dim ivBytes(15) As Byte
        Using fsEncrypted As New FileStream(inputFile, FileMode.Open)
            fsEncrypted.Read(ivBytes, 0, ivBytes.Length)
        End Using
        aesAlg.IV = ivBytes

        Using decryptor As ICryptoTransform = aesAlg.CreateDecryptor()
            Using fsEncrypted As New FileStream(inputFile, FileMode.Open)
                ' Passez les 16 premiers octets de l'IV
                fsEncrypted.Seek(16, SeekOrigin.Begin)

                Using fsOutput As New FileStream(outputFile, FileMode.Create)
                    Using cryptoStream As New CryptoStream(fsEncrypted, decryptor, CryptoStreamMode.Read)
                        Dim buffer(4096) As Byte
                        Dim bytesRead As Integer

                        Do
                            bytesRead = cryptoStream.Read(buffer, 0, buffer.Length)
                            If bytesRead > 0 Then
                                fsOutput.Write(buffer, 0, bytesRead)
                            End If
                        Loop While bytesRead > 0
                    End Using
                End Using
            End Using
        End Using
    End Sub



    Public Shared Sub EncryptFolder(ByVal folderPath As String, ByVal key As String)
        Dim files As String() = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories)

        For Each file0 In files
            Dim encryptedFile As String = file0 & ".protected"
            Encrypt(file0, encryptedFile, key)
            File.Delete(file0)
        Next
    End Sub

    Public Shared Sub DecryptFolder(ByVal folderPath As String, ByVal key As String)
        Dim encryptedFiles As String() = Directory.GetFiles(folderPath, "*.protected", SearchOption.AllDirectories)

        For Each encryptedFile In encryptedFiles
            Dim decryptedFile As String = encryptedFile.Substring(0, encryptedFile.Length - ".protected".Length)
            Decrypt(encryptedFile, decryptedFile, key)
            File.Delete(encryptedFile)
        Next
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim folder As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test"
        Dim encryptionKey As String = "FG87H4JKIIU4O45DS4hn8e14j8e1fd8zi17"

        ' Chiffrer le dossier
        EncryptFolder(folder, encryptionKey)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim folder As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test"
        Dim decryptionKey As String = "FG87H4JKIIU4O45DS18"

        ' Déchiffrer le dossier
        DecryptFolder(folder, decryptionKey)
    End Sub

End Class

J'ai déjà passé en revue le code et vérifié que les clés sont correctement spécifiées pour le chiffrement et le déchiffrement, mais je ne parviens pas à comprendre pourquoi le déchiffrement réussit avec des clés différentes.

Avez-vous des idées sur ce qui pourrait causer ce comportement inattendu ? Toute aide serait grandement appréciée.

Merci d'avance pour votre aide !

A voir également:

2 réponses

NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 332
10 sept. 2023 à 10:57

C'est pour ça que les outils qui font du chiffrement utilisent des sommes de contrôle ou hash.
Par exemple CRC(16 ou 32), MD5, SHA, ...
Si le hash n'est pas bon, c'est que la clé est erronée ou le fichier chiffré est corrompu.


0
HU0 Messages postés 2 Date d'inscription dimanche 10 septembre 2023 Statut Membre Dernière intervention 10 septembre 2023
10 sept. 2023 à 11:16

Merci pour votre réponse. Je comprends l'importance de la vérification de l'intégrité des données lors du chiffrement/déchiffrement. Cependant, j'ai rencontré un problème spécifique avec mon code de chiffrement en VB.NET sur Windows 11 en utilisant AES-128.

Le problème est que même si j'utilise des clés différentes pour le chiffrement et le déchiffrement, je peux toujours accéder au fichier déchiffré sans erreur ni altération des données. Cela semble contrevenir aux principes de sécurité du chiffrement.

Avez-vous une idée de ce qui pourrait causer ce problème ou une suggestion pour le résoudre ? Je suis ouvert à toute aide ou conseil que vous pourriez fournir.

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469 > HU0 Messages postés 2 Date d'inscription dimanche 10 septembre 2023 Statut Membre Dernière intervention 10 septembre 2023
11 sept. 2023 à 13:40

bonjour,

le fichier est correctement déchiffré quelle que soit la clé de déchiffrement spécifiée dans le programme?

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469 > yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024
11 sept. 2023 à 13:51

As-tu essayé avec une clé "01234567890123456"?

0
NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 332 > HU0 Messages postés 2 Date d'inscription dimanche 10 septembre 2023 Statut Membre Dernière intervention 10 septembre 2023
13 sept. 2023 à 20:44

Dis comme ça, il faut voir ton code de chiffrement et déchiffrement, tu dois avoir un souci dans ton code, la clé devrait avoir un impacte.

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469
15 sept. 2023 à 09:49

Quand tu as passé en revue le code, as-tu également lu les lignes 13 et 50.

Comprends-tu ce que fait le programme juste après ces commentaires?

0