Bonsoir !
J'ai enfin réussis, en m'y mettant un peu à résoudre mon petit problème de connexion. Comme je pense que ça peut-être utile à d'autre, je vais en faire un cours tutoriel. Depuis la dernière mise à jours, le mot de passe que l'on envoi au serveur de Dofus n'est plus crypté en MD5 mais en RSA. De plus, cryptage de celui est légèrement plus complexe. Effectivement, maintenant il faut dans l'ordre :
• Convertir en bytes : (key (Reçus dans le packet HelloConnectMessage) + Votre mot de passe.
• Ensuite il faut "purifier" la PUBLIC_KEY (Qui se trouve dans AuthentificationManager.as, en décompilant le client du jeu).
• Convertir la PUBLIC_KEY en bytes en utilisant Base64.
• Récupérer les paramètres RSA grâce à la PUBLIC_KEY.
• Crypter les bytes de notre premier tableau de bytes, contenant "Key + Votre mot de passe" via ces paramètres.
• Et finalement, retourner le résultat dans une chaine de caractère, encore une fois en utilisant Base64.
Que dire de plus ? Si ce n'est, "Allons-y, Alonzo" !
Les Pré-Requis :
1. CSInteropKey.
Nous allons créer une nouvelle classe pour que notre code reste propre. Appelez là comme vous le souhaitez, chez moi elle se nomme bêtement "RSACrypt". Dedans vous allez devoir importer la bibliothèque de classe CSInteropKey. Téléchargez là et ouvrez la solution que contient le dossier. On va devoir l'éditer !
Vous remarquerez certainement que la plupart des classes et des fonctions sont déclarés en "Internal". C'est à dire qu'elles ne sont accessibles qu'au sein du projet. Nous allons devoir remédier à ça pour pouvoir les utiliser dans notre projet. Dans le fichier AsnKeyPaser.cs, remplacez le "Internal" de la classe AsnKeyParser en "Public". Faites de même avec la méthode du même nom. Une fois que la méthode est devenue publique, nous allons la surcharger, juste en dessous de celle-ci ajoutez :
// On change le paramètre, le path devient un tableau de byte.
public AsnKeyParser(byte[] Data)
{
// On instancie directement le parser et... On parse notre tableau de byte.
parser = new AsnParser(Data);
}
Comme ça, on va pouvoir passer directement notre tableau de byte au Parser ! Ensuite, rendez vous à la méthode "RSAParameters ParsePublicKey" et passez là de "Internal" à "Public", on va en avoir besoin également ! Pour résumer, on a rendu public la classe AsnKeyParser, on a surchargé la méthode AsnKeyParser et on a rendu public la méthode ParsePublicKey !
Ensuite, pour terminer, dans les options de votre projet, dans l'onglet "Application", changez Type de sortie en "Bibliothèque de classe" et générer votre DLL.
2. Les Imports.
Alors là, je vous rassure, par rapport à ce qu'on vient de faire, c'est du gâteau. Dans votre projet, qui contient votre classe RSACrypt, cliquez dans l'explorateur de solution sur votre projet, puis "Ajoutez une référence" puis dans l'onglet "Parcourir" allez chercher la DLL "CSInteropKey" que vous venez de générer. Maintenant qu'elle fait partie de votre projet, ajoutez vos imports à votre classe :
Imports System.Security.Cryptography
Imports CSInteropKeys
La classe RSACrypt :
Nous allons utiliser dans notre classe deux fonctions. La seconde fonction permettra de renvoyer la PUBLIC_KEY "purifiée" (Sans header et sans retour de ligne) à la première qui sera chargée de crypter notre mot de passe. J'ai décidé de déclarer mes fonctions "Shared" pour pouvoir les utiliser sans avoir à instancier ma classe. Ensuite, toutes les explications sont sous forme de commentaire !
Imports System.Security.Cryptography
Imports CSInteropKeys
Public Class RSACrypt
Shared PUBLIC_KEY As String = "-----BEGIN PUBLIC KEY-----\n" + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApHRiGIhIJrNdUJkKGtWC\n" + "sSqIza+2gPsjGXhSoDTOcokq59Et8d8SzgF68RvAZXezPO8tnUhlyvaDem4QSFLV\n" + "PVAmSRcp47HW4lpp11WHBlDsEEXQTBkM8nDyqSgn8dMANvButRDt/44OKslrfqmV\n" + "7ANmZggZ2wXN0T6XWt3FVC66X8+E7rUMUOREQYCDq3zrX4dNYy3y21lyJZeXTkSd\n" + "AmijqIHrrwLPTA/wpWLCEaIJ9OAWjds8L6TqONXvnf3qOtI/QsrWv24lRjtmRSeR\n" + "eKFIPrk8QQbcd2h4VUi06fJZ2ydCx0pOwU33izN42pmZoCrgdCwghFm1i2feQa0M\n" + "vQIDAQAB\n" + "-----END PUBLIC KEY-----"
Friend Shared Crypt As RSACryptoServiceProvider
Friend Shared rsaParameter As RSAParameters
Friend Shared KEY_HEADER As String = "-----BEGIN PUBLIC KEY-----"
Friend Shared KEY_FOOTER As String = "-----END PUBLIC KEY-----"
Public Shared Function cipherRsaString(ByVal key As String, ByVal password As String) As String
'On encode la _key reçus dans HelloConnectMessage avec le mot de passe en Bytes.
Dim Input() As Byte = System.Text.Encoding.UTF8.GetBytes(key + password)
'On déclare un nouveau Service de cryptage RSA pour chiffrer et déchiffrer.
Crypt = New RSACryptoServiceProvider
'On convertit la PUBLIC_KEY en un tableau d'entiers de 8bits.
Dim BinaryData() As Byte = GetPublicKey()
'On utilise CSInteropKeys pour parser la clé et obtenir les informations du cryptage RSA.
Dim KeyParser As New AsnKeyParser(BinaryData)
rsaParameter = KeyParser.ParseRSAPublicKey()
'On importe les paramètres dans notre service de cryptage.
Crypt.ImportParameters(rsaParameter)
'On encrypte La clé, avec le mot de passe, celon les paramètres de la public key.
Dim Ouput() As Byte = Crypt.Encrypt(Input, False)
'On convertit notre tableau de bytes en chaine de caractère, et on la renvoit en résultat de fonction.
Return System.Convert.ToBase64String(Ouput)
End Function
'Fonction développée par Maxilia.
Friend Shared Function GetPublicKey() As Byte()
'On définie deux index pour lire la PublicKey
Dim Index1 As Integer = KEY_HEADER.Length
Dim Index2 As Integer = PUBLIC_KEY.IndexOf(KEY_FOOTER) - Index1
'On obtient ici la PublicKey sans le header et le footer
Dim Temp As String = PUBLIC_KEY.Substring(Index1, Index2)
'On supprime les saut de ligne
Temp = Temp.Replace("\n", "")
'On convertie la Key en Byte et on la retourne.
Return Convert.FromBase64String(Temp)
End Function
End Class
Ensuite, pour récupérer votre mot de passe crypté, rien de plus simple :
RSACrypt.cipherRsaString(Key, Motdepasse)
Je tiens à remercier de l'aide précieuse de MikeDotNet et de Maxilia, sans eux je ne pense pas que j'aurais réussis. D'ailleurs, la deuxième fonction est de Maxilia. Il l'a laissé en libre accès sur le sujet concernant à la mise à jour. Aucune mention pour Overedge, qui n'a pas hésité à choisir la solution de facilité et me laisser tomber :p.
J'espère que cela vous aidera, amicalement, Shornaal.