IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

AES problème de chiffrement via les sockets


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2015
    Messages : 35
    Par défaut AES problème de chiffrement via les sockets
    Bonjour,

    Je sais que lors du chiffrement avec AES, on utilise ConvertFromString and ConvertToString mais en utilisant les sockets, je dois rester en byte et lors du déchiffrement par le serveur, le serveur transmet une erreur : "The padding is invalid and cannot be removed."
    Partie serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Friend Function serverconnexion(ByVal sender As System.Object, e As System.EventArgs)
            Try
                Dim c As New TcpListener(Net.IPAddress.Parse("127.0.0.1"), "7008")
                c.Start()
                Console.WriteLine("starting...")
                Dim a As TcpClient = c.AcceptTcpClient()
                Dim b As New NetworkStream(a.Client)
                Dim rsachiffrement As New System.Security.Cryptography.RSACryptoServiceProvider
                b.Write(System.Text.Encoding.UTF8.GetBytes(rsachiffrement.ToXmlString(False)), 0, System.Text.Encoding.UTF8.GetBytes(rsachiffrement.ToXmlString(False)).Count)
                Dim rsa1(a.ReceiveBufferSize) As Byte
                Dim index As Integer = b.Read(rsa1, 0, a.ReceiveBufferSize)
                Dim rsa2(index - 1) As Byte
                For i = 0 To index - 1
                    rsa2(i) = rsa1(i)
                Next
                Dim rsa() As Byte = rsachiffrement.Decrypt(rsa2, False)
                Dim aeschiffrement As New System.Security.Cryptography.AesCryptoServiceProvider
                aeschiffrement.Mode = Security.Cryptography.CipherMode.CFB
                Buffer.BlockCopy(rsa, 0, aeschiffrement.Key, 0, 32)
                Buffer.BlockCopy(rsa, 32, aeschiffrement.IV, 0, 16)
                Dim aesencryptor = aeschiffrement.CreateEncryptor
                Dim aesdecryptor = aeschiffrement.CreateDecryptor
                Dim aes1(a.ReceiveBufferSize) As Byte
                Dim index1 As Integer = b.Read(aes1, 0, a.ReceiveBufferSize)
                Dim aes2(index1 - 1) As Byte
                For i = 0 To index1 - 1
                    aes2(i) = aes1(i)
                Next
                Dim aes As New MemoryStream
                Using s As New System.Security.Cryptography.CryptoStream(aes, aesdecryptor, Security.Cryptography.CryptoStreamMode.Write)
                    s.Write(aes2, 0, aes2.Count)
                End Using
                Console.WriteLine("Longueur serveur : " & aes.Length)
                Console.WriteLine("Server : " & aes.ToArray.Count)
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Function
    Partie cliente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Dim a As New TcpClient
            Console.WriteLine("starting2...")
            a.Connect("127.0.0.1", "7008")
            Console.WriteLine("Ok")
            Dim b As New NetworkStream(a.Client)
            Dim rsa(a.ReceiveBufferSize) As Byte
            b.Read(rsa, 0, a.ReceiveBufferSize)
            'Fabrication de la clé aléatoire
            Dim key As String = ""
            Dim characters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyz0123456789"
            Randomize()
            For i = 0 To 16
                key += characters(Math.Floor(Rnd() * characters.Length))
            Next
            Dim process As New System.Security.Cryptography.Rfc2898DeriveBytes(key, 8, 10000)
            Dim keytoencrypt() As Byte = process.GetBytes(48)
            Dim rsachiffrement As New System.Security.Cryptography.RSACryptoServiceProvider
            rsachiffrement.FromXmlString(System.Text.Encoding.UTF8.GetString(rsa))
            b.Write(rsachiffrement.Encrypt(keytoencrypt, False), 0, rsachiffrement.Encrypt(keytoencrypt, False).Count)
            Dim aeschiffrement As New System.Security.Cryptography.AesCryptoServiceProvider
            aeschiffrement.Mode = System.Security.Cryptography.CipherMode.CFB
            Buffer.BlockCopy(keytoencrypt, 0, aeschiffrement.Key, 0, 32)
            Buffer.BlockCopy(keytoencrypt, 32, aeschiffrement.IV, 0, 16)
            Dim aesencryptor = aeschiffrement.CreateEncryptor
            Dim aesdecryptor = aeschiffrement.CreateDecryptor
            Dim aes As New MemoryStream
            Using s As New System.Security.Cryptography.CryptoStream(aes, aesencryptor, System.Security.Cryptography.CryptoStreamMode.Write)
                s.Write(System.Text.Encoding.UTF8.GetBytes(getinfos), 0, System.Text.Encoding.UTF8.GetBytes(getinfos).Count)
            End Using
            b.Write(aes.ToArray, 0, aes.ToArray.Count)
            Console.WriteLine("Longueur : " & aes.Length)
            Console.WriteLine("Client : " & getinfos)
    La longueur reçue des deux côtés est correct, les clés sont transmises correctement (je l'ai testé), le seul problème est donc le déchiffrement par AES via la clé et le IV envoyé qui ne fonctionne pas. getinfos() renvoie des données au format String séparés par des ":" tels que "A:B:C:D:10/10/1976:E". Quelqu'un a-t-il une idée? Merci.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2015
    Messages : 35
    Par défaut
    Bon, j'ai réussi à trouver l'endroit où ça ne marche pas, c'est à la réception de la clé aléatoire généré par le client et dérivé par RFC2008. Voici ci-dessous le code modifié et la fenêtre du log :
    Partie serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Friend Function serverconnexion(ByVal sender As System.Object, e As System.EventArgs)
            Try
                Dim c As New TcpListener(Net.IPAddress.Parse("127.0.0.1"), "7008")
                c.Start()
                Console.WriteLine("starting...")
                Dim a As TcpClient = c.AcceptTcpClient()
                Dim b As New NetworkStream(a.Client)
                Dim rsachiffrement As New System.Security.Cryptography.RSACryptoServiceProvider
                b.Write(System.Text.Encoding.UTF8.GetBytes(rsachiffrement.ToXmlString(False)), 0, System.Text.Encoding.UTF8.GetBytes(rsachiffrement.ToXmlString(False)).Count)
                b.Flush()
                Console.WriteLine("Public key envoyé:" & rsachiffrement.ToXmlString(False))
                Dim rsa1(a.ReceiveBufferSize) As Byte
                Dim index = b.Read(rsa1, 0, a.ReceiveBufferSize)
                b.Flush()
                Dim rsa2(index - 1) As Byte
                For i = 0 To index - 1
                    rsa2(i) = rsa1(i)
                Next
                Dim text As String = ""
                For i = 0 To rsa2.Count - 1
                    text += rsa2(i).ToString("x2")
                Next
                Console.WriteLine("Key reçue:" & text)
                Dim rsa() As Byte = rsachiffrement.Decrypt(rsa2, False)
                Dim aeschiffrement As New System.Security.Cryptography.AesCryptoServiceProvider
                aeschiffrement.Mode = Security.Cryptography.CipherMode.CBC
                Buffer.BlockCopy(rsa, 0, aeschiffrement.Key, 0, 32)
                Buffer.BlockCopy(rsa, 32, aeschiffrement.IV, 0, 16)
                Dim key As String = ""
                Dim IV As String = ""
                For i = 0 To aeschiffrement.Key.Count - 1
                    key += aeschiffrement.Key(i).ToString("x2")
                Next
                For i = 0 To aeschiffrement.IV.Count - 1
                    IV += aeschiffrement.IV(i).ToString("x2")
                Next
                Console.WriteLine(key & ":" & IV)
                Dim aesencryptor = aeschiffrement.CreateEncryptor
                Dim aesdecryptor = aeschiffrement.CreateDecryptor
                Dim aes1(a.ReceiveBufferSize) As Byte
                Dim index1 As Integer = b.Read(aes1, 0, a.ReceiveBufferSize)
                b.Flush()
                Dim aes2(index1 - 1) As Byte
                For i = 0 To index1 - 1
                    aes2(i) = aes1(i)
                Next
                IO.File.WriteAllBytes("decrypted.txt", aes2)
                aes2 = Convert.FromBase64String(IO.File.ReadAllText("decrypted.txt"))
                IO.File.Delete("decrypted.txt")
                Dim aes As New MemoryStream
                Using s As New System.Security.Cryptography.CryptoStream(aes, aesdecryptor, Security.Cryptography.CryptoStreamMode.Write)
                    s.Write(aes2, 0, aes2.Count)
                End Using
                Console.WriteLine("Longueur serveur : " & aes.ToArray.Count)
                Console.WriteLine("Server : " & System.Text.Encoding.UTF8.GetString(aes2))
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Function
    Partie cliente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Dim a As New TcpClient
            Console.WriteLine("starting2...")
            a.Connect("127.0.0.1", "7008")
            Console.WriteLine("Ok")
            Dim b As New NetworkStream(a.Client)
            Dim prersa(a.ReceiveBufferSize) As Byte
            Dim index = b.Read(prersa, 0, a.ReceiveBufferSize)
            b.Flush()
            Dim rsa(index - 1) As Byte
            For i = 0 To index - 1
                rsa(i) = prersa(i)
            Next
            Console.WriteLine("Public key reçue:" & System.Text.Encoding.UTF8.GetString(rsa))
            'Fabrication de la clé aléatoire
            Dim key As String = ""
            Dim characters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyz0123456789"
            Randomize()
            For i = 0 To 16
                key += characters(Math.Floor(Rnd() * characters.Length))
            Next
            Dim process As New System.Security.Cryptography.Rfc2898DeriveBytes(key, 8, 10000)
            Dim keytoencrypt() As Byte = process.GetBytes(48)
            Dim rsachiffrement As New System.Security.Cryptography.RSACryptoServiceProvider
            b.Write(rsachiffrement.Encrypt(keytoencrypt, False), 0, rsachiffrement.Encrypt(keytoencrypt, False).Count)
            b.Flush()
            Dim text As String = ""
            For i = 0 To rsachiffrement.Encrypt(keytoencrypt, False).Count - 1
                text += rsachiffrement.Encrypt(keytoencrypt, False)(i).ToString("x2")
            Next
            Console.WriteLine("Key : " & text)
            Dim aeschiffrement As New System.Security.Cryptography.AesCryptoServiceProvider
            aeschiffrement.Mode = System.Security.Cryptography.CipherMode.CBC
            Buffer.BlockCopy(keytoencrypt, 0, aeschiffrement.Key, 0, 32)
            Buffer.BlockCopy(keytoencrypt, 32, aeschiffrement.IV, 0, 16)
            Dim key1 As String = ""
            Dim IV1 As String = ""
            For i = 0 To aeschiffrement.Key.Count - 1
                key1 += aeschiffrement.Key(i).ToString("x2")
            Next
            For i = 0 To aeschiffrement.IV.Count - 1
                IV1 += aeschiffrement.IV(i).ToString("x2")
            Next
            Console.WriteLine(key1 & ":" & IV1)
            Dim aesencryptor = aeschiffrement.CreateEncryptor
            Dim aesdecryptor = aeschiffrement.CreateDecryptor
            Dim aes As New MemoryStream
            Using s As New System.Security.Cryptography.CryptoStream(aes, aesencryptor, System.Security.Cryptography.CryptoStreamMode.Write)
                s.Write(System.Text.Encoding.UTF8.GetBytes(getinfos), 0, System.Text.Encoding.UTF8.GetBytes(getinfos).Count)
            End Using
            IO.File.WriteAllText("crypted.txt", Convert.ToBase64String(aes.ToArray))
            b.Write(IO.File.ReadAllBytes("crypted.txt"), 0, IO.File.ReadAllBytes("crypted.txt").Count)
            b.Flush()
            IO.File.Delete("crypted.txt")
            Console.WriteLine("Longueur : " & aes.ToArray.Count)
            Console.WriteLine("Client : " & getinfos)
    Log :
    Nom : logs.png
Affichages : 128
Taille : 24,7 Ko

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2015
    Messages : 35
    Par défaut
    Alors, voici le problème, j'ai BufferCopy qui ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim rsa() As Byte = rsachiffrement.Decrypt(rsa2, False)
                Console.WriteLine("ServerKey:{0}", Convert.ToBase64String(rsa))
                Dim aeschiffrement As New System.Security.Cryptography.AesCryptoServiceProvider
                Array.Clear(aeschiffrement.Key, 0, aeschiffrement.Key.Count)
                Array.Clear(aeschiffrement.IV, 0, aeschiffrement.IV.Count)
                For i = 0 To 31
                    aeschiffrement.Key(i) = rsa(i)
                Next
                For i = 32 To 47
                    aeschiffrement.IV(i - 32) = rsa(i)
                Next
                Console.WriteLine("Serveur:{0}", Convert.ToBase64String(aeschiffrement.Key))
    La clé AES et le vecteur d'initialisation (IV) ne change pas malgré mon changement, j'ai même essayé avec BufferCopy mais ça ne fonctionne pas, quelqu'un aurait-il une piste? Merci.

Discussions similaires

  1. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40
  2. Réponses: 6
    Dernier message: 05/12/2008, 21h19
  3. programmer un chat via les sockets
    Par mouskro76 dans le forum Linux
    Réponses: 1
    Dernier message: 14/10/2007, 12h28
  4. erreur lors de l'envoie de donné via les socket.
    Par poporiding dans le forum C++
    Réponses: 1
    Dernier message: 23/05/2006, 14h23
  5. ICMP Echo via les Sockets
    Par trinity.sakura dans le forum Langage
    Réponses: 4
    Dernier message: 12/09/2005, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo