Bonjour à tous, aujourd'hui, ON VA FABRIQUER UNE BOMBE. Non je déconne, je vais vous expliquer comment créer vos propre clefs RSA pour arrêter de charcuter votre client affin d'accéder au identifiants et la clef AES après lors de l'authentification. C'est mal, respectez votre Invoker.
Cette méthode à été testé sur 3 versions de Dofus 2, incluant la plus récente à ce jour, la 2.57.
Il vous faudra quelques outils, vos doigts en premier, mais également JPEXS qu'on ne présente plus, disponible sur Windows, Unix et probablement Mac j'ai la flemme de vérifier.
Comment ce merdier fonctionne donc ?
Déjà, il y a 5 clefs. Ouais je sais c'est déjà chiant.
Les deux plus importantes maintenant sont la SIGNATURE_KEY_DATA (qui s’appellera Brigitte dans la suite de ce tutoriel), et AuthentificationManager__verifyKey (qui sera donc Michel pour la suite), que vous pourrez trouver dans le dossier binaryData avec JPEXS une fois votre client ouvert.
Brigitte sert à signer des fichiers ou du texte, elle est utilisé dans la partie "host.signature" de votre config.xml, et également dans le fichier signature.xmls de votre thème Dofus (content/themes/darkTheme pour vous normalement).
Michel quant à lui, sert à chiffrer les identifiants en provenance votre client, c'est lui qui est casse couille, vous pouvez le taper allez-y.
Brigitte et Michel sont de type différent, Brigitte est une clef spéciale qui se construit à partir d'une clef RSA, mais qui ressort comme ça :
![img]()
Michel est aussi construit à partir d'une clef RSA, mais ressort légèrement différent :

Commençons par le commencement, vous allez donc devoir utiliser votre langage de programmation préféré pour générer une paire de clef, publique et privée, de taille 2048 pour les besoins de ce tutoriel, mais vous pouvez faire plus gros si vous le voulez, mais pas plus petit.
Ces clefs doivent être de type PKCS1, fomat X.059 (normalement c'est par défaut). La clef privée elle doit être exporté en PEM dans l'idéal dans un fichier que vous devez garder.
La clef publique, convertissez là au format DER, encodez là en base64, et rajoutez les headers et footers: "-----BEGIN PUBLIC KEY-----" et "-----END PUBLIC KEY-----"
Vous pouvez tester le résultat ici :
https://8gwifi.org/PemParserFunctions.jsp
Vous devriez avoir en header :
![img]()
On reste là, vous devez également la clef de signature. Vous devez donc récupérer le module et l'exposant de cette clef publique.
Vous prenez un BinaryWriter BIG ENDIAN classique utilisé pour le protocole Dofus, et vous faites donc (writeUTF implique un writeShort/writeUShort de la taille juste avant la string):
BinaryWriter.writeUTF('DofusPublicKey');
BinaryWriter.writeUTF(publicKey.module.toHex()); // Attention, le format hexa doit être appliqué
BinaryWriter.writeUTF(publicKey.exposant.toHex()); // Ici aussi
Une fois ceci fait, vous exportez le buffer de votre BinaryWriter dans un fichier, et vous aurez obtenu Michel. Gg.
Nous avons donc 3 clefs, une publique, une privée, et une de signature.
La clef publique et la clef de signature vous pouvez maintenant les remplacer dans le client avec JPEXS facilement.
Je ne vais pas expliquer comment signer des fichiers ou les hosts ici, vous êtes libre de le faire vous même grâce au fichier "com.ankamagames.jerakine.utils.crypto.Signature". Y'a environ 20 lignes à recopier, donc ça va.
Maintenant, utiliser la clef privée à la connexion en jeu.
A la connexion d'un nouveau client vous allez donc générer une nouvelle paire de clef, de taille inférieur à la paire générée précédemment, dans ce cas nous choisirons 1024. Les deux clefs doivent être même format évoqué précédemment.
Vous allez maintenant convertir la clef publique créée à l'instant au format DER, et vous encrypter ça avec la clef privée utilisée précédemment, celle que je vous ai dit de conserver. Et j'ai dit ENCRYPTER, pas SIGNER.
Une fois ceci fait, vous pouvez envoyer cette clef encrypté dans votre HelloConnectMessage. Si vous avez fait le boulot correctement, vous devriez recevoir un packet IdentificationMessage, vous pouvez vous applaudir.
Dans ce message vous aurez un champ "credentials" contenant un tableau de bytes. Nous allons donc le déchiffrer avec la clef privée associé à la clef publique qui a été envoyé dans le packet HelloConnect. Le décryptage doit s’effectuer au padding PKCS1.
Dans la propriété "credentials" vous aurez:
32 bytes - salt - UTF
32 bytes - clef AES - tableau de bytes
1 byte - taille de l'identifiant de l'utilisateur - nombre
? bytes - identifiant de l'utilisateur, vous devez lire n bytes en fonction du paramètre précédent - UTF
? bytes - mot de passe, vous pouvez lire le reste jusqu'à la fin du buffer - UTF
Voilà vous avez tout les cochons, have fun !
Si vous avez des questions j'essayerait d'y répondre au mieux sous ce sujet.
EDIT 23/05/2021 :
Lien de l'outil de génération de clef et de signature : https://www.mediafire.com/file/yo52nhafcjwzl0q/signature.rar/file
Lien du mini émulateur de test : https://www.mediafire.com/file/2cklras3k6gdyr7/emulator.rar/file
Lien de la rediffusion du live : https://www.youtube.com/watch?v=eMIjpyBPNnI
EDIT 09/12/2021 :
Pour ceux qui ont la nouvelle version de Node Forge il y aura une erreur sur index.ts dans l'outil de signature, remplacez ligne 29 et 30 :
const n: string = BigInt(publicKeyObject.n).toString(16);
const e: string = BigInt(publicKeyObject.e).toString(16);
Par
const n: string = publicKeyObject.n.toString(16);
const e: string = publicKeyObject.e.toString(16);