C/C++ Problème de clef publique RSA (trame id=3 / 4)

Inscrit
22 Aout 2014
Messages
4
Reactions
0
#1
Bonjour tout le monde!

Depuis quelques temps je m'intéresse a la création d'un bot full socket mais je rencontre un problème au niveau de la connexion.

J'ai cru comprendre qu'il fallait se servir de la clef contenue dans le fichier 381.bin (une fois dofusinvoker.swf décompilé) pour décrypter la clef public reçut a la trame ID=3. Une fois cela fait, impossible de charger cette clef. J'ai essayé d'enregistrer dans un fichier (en transformant en base64) et a chaque fois j'obtiens un résultat plausible exactement de la meme forme que n'importe quelle clef publique rsa 2048 bits générée avec openssl pourtant, impossible d'en extraire les informations.

Mon problème vient peut etre du fait que la ligne readKey.verify(baSignedKey,key,baSignedKey.length); (AuthentificationManager.as) fait plus que d'utiliser la clef de 381.bin pour récupéré la clef publique comme je l'ai supposé (j'utilise simplement un RSA_public_decrypt(keyLen, key, publicKey, RSAPublicKey, RSA_PKCS1_PADDING)). Si quelqu'un peut confirmé si je suis totalement a coté de la plaque ou pas...

J'ai également vu dans ce post viewtopic.php?f=47&t=1671&start=10 qu'il fallait s'intéresser au fichier com/ankamagames/jerakine/utils/crypto/SignatureKey.as mais il ne m'a pas l'air utile dans mon cas car utilise une autre clef. Si quelqu'un peut confirmé aussi...

Merci d'avance pour vos réponses!

PS: En utilisant codeblocks il m'était impossible d'utiliser certaines fonction d'openssl, après quelques recherches j'ai trouvé que c'était surement un probleme de lib et/ou alors il falait inclure applink.c, j'ai vérifié les libs et sa ne fonctionnait toujours pas et en incluant se fichier j'ai plein d'erreurs de compilation. Si quelqu'un a une idée pour résoudre se problème, sinon j'utilise VS et sa marche bien mais ayant plus l'habitude de codeblocks je préférerais retourné dessus.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonjour,

J'aurais bien voulu t'aider mais je n'ai pas accès à mon ordinateur avant quelques jours. Tout ce que je peux te dire c'est qu'ankama n'utilise pas un RSA classique, il faut que tu ailles étudier le traitement du Paquet HelloConnectMessage dans la partie 'logic' du jeu qui contient tout les frames.

Tu auras besoin de la référence 'System.Numerics' qui contient la classe BigInteger qu'utilise le RSA.
Après c'est juste un travail d'adaptation, la clé qui permet le décryptage se trouve dans les fichiers binaires.

Bonne chance et bonne journée
 
Inscrit
22 Aout 2014
Messages
4
Reactions
0
#3
Merci déjà de ta réponse j'attends que tu récupère ton ordinateur avec impatience!

Je n'avais pas encore regardé le fichier AuthentificationFrame, celui-ci confirme que la fonction setPublicKey de AuthentificationManager.as a bien le role que je pensais et donc, étant donné que tu as dis que ce n'était pas un RSA classique je penses que ma supposition sur readkey.verify était fondé, je vais donc creuser un peu dans son fonctionnement.
 
Inscrit
22 Aout 2014
Messages
4
Reactions
0
#4
J'ai un peu avancé: j'arrive maintenant a récupérer la clef par contre impossible de me connecté. Je construis bien la trame mais quand je l'envoie sa ne marche jamais.

Mon erreur viens surement de la création du credential. J'ai cru comprendre que c'était (le salt récupéré dans la trame précédente + la taille du nom de compte + le nom de compte + (le mdp + le salt)haché en md5) le tout crypter en rsa avec la clef récupérée précédemment. J'ai également essayé sans haché ou en ne hachant que le mdp etc... mais rien ne marche.

J'utilise les fonction de hachage de openssl donc donc peu etre que le hachage d'ankama est différent mais j'ai cru comprendre que c'était un système standardisé.

Si quelqu'un a une idée pour résoudre mon problème merci d'avance
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#5
Bonsoir,

tu as du te foirer sur le password.
Voici comment procéder: (le mot de passe doit être ajouté sans modification)

C#:
List<byte> Credentials = new List<byte>();

            Credentials.AddRange(Encoding.UTF8.GetBytes(salt));
            Credentials.Add(Convert.ToByte(username.Length));
            Credentials.AddRange(Encoding.UTF8.GetBytes(username));
            Credentials.AddRange(Encoding.UTF8.GetBytes(password));

            byte[] result = publickey.Encrypt(Credentials.ToArray(), false);

Bonne soirée
 
Dernière édition:
Inscrit
22 Aout 2014
Messages
4
Reactions
0
#6
Merci c'est bon sa marche! J'avais déjà essayé comme sa mais j'avais oublié de modifié un truc que j'utilisais dans les tests d'avant donc j'avais supposer que c'était faux...

Encore merci! Je vous tiens au courant si j'ai d'autres problèmes.
 
Haut Bas