Cryptage md5 en c# et en VB

Résolu
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011 - 4 nov. 2010 à 09:43
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013 - 5 nov. 2010 à 12:46
Bonjour tout le monde,

j'ai un petit soucis dans une communication entre deux programmes.

D'un côté j'ai un programme en vb qui me crypte un mot de passe en md5 :

Private Function CalculateMD5Hash(ByVal password As String) As String
        Dim encoder As Encoder
        Dim unicodeText() As Byte
        Dim md5 As MD5CryptoServiceProvider
        Dim result() As Byte
        Dim builder As StringBuilder

        encoder = System.Text.Encoding.Unicode.GetEncoder()

        ReDim unicodeText(password.Length * 2)

        encoder.GetBytes(password.ToCharArray(), 0, password.Length, unicodeText, 0, True)

        md5 = New MD5CryptoServiceProvider()
        result = md5.ComputeHash(unicodeText)

        builder = New StringBuilder()
        For i As Integer = 0 To result.Length - 1
            builder.Append(result(i).ToString("X2"))
        Next

        Return builder.ToString()
    End Function



De l'autre côté, j'ai un programme en C# qui reçoit cette chaîne de caractère cryptée. Seulement, si je prend la même chaîne de caractère, je n'ai pas le même résultat.

Fonction C#:

private string GetMD5Hash(string str)
        {
            Encoder enc = System.Text.Encoding.Unicode.GetEncoder();

            byte[] unicodeText = new byte[str.Length * 2];
            enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);

            MD5 md5 = new MD5CryptoServiceProvider();

            byte[] result = md5.ComputeHash(unicodeText);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("X2"));
            }
            return sb.ToString();
        }


Est-ce que c'est possible que le hash des deux fonctions retournent un résultat différent sur une même chaîne de caractère ??


Merci.
A voir également:

3 réponses

Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
5 nov. 2010 à 12:46
Bonjour,

En fait ça serait plutôt le contraire, "réduire" de 1 la taille du tableau VB.Net. Là dans les deux cas tu auras une case de tableau vide qui sera hashée et donc faussera le résultat même s'il sera identique entre tes deux versions

Pour t'en convaincre compare tes résultats avec ce que tu obtiens par exemple sur ce site MD5 Generator

Après c'est peut-être souhaité comme comportement :D

Cordialement !
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
4 nov. 2010 à 15:48
Bonjour,

Que le hash retourne deux valeurs différentes pour une même chaîne, j'en doute ; par contre qu'il retourne deux hash différents pour deux chaînes différentes c'est déjà plus probable étant donné que c'est ce qu'il se passe ici...

Pour déclarer un tableau de taille N (et donc d'indice maximal N-1) il faut faire
byte[] myArray = new byte[N];

Dim myArray As Byte() = New Byte(N - 1) {}


Ainsi dans les deux cas tu ne haches pas la même "chaîne" convertie en binaire.

Après je n'ai pas vérifié plus que cela, mais j'ai vu ce détail qui m'a sauté aux yeux, j'espère que cela règlera ton souci.

Cordialement !
Spawn3107 Messages postés 84 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 28 mars 2011
5 nov. 2010 à 11:39
En effet, il fallait changer la longueur du tableau de byte:
Byte[] unicodeText = new Byte[(password.Length * 2) + 1];
Rejoignez-nous