Analyse [RÉSOLU] Cryptage RSA Wakfu émulateur soucis

suntyop

Contributeur
Inscrit
6 Avril 2016
Messages
17
Reactions
2
#1
Bonsoir,
Je développe actuellement un émulateur WAKFU et je bloque sur une étape.
Voici les différentes étapes :
1 - Le client envoi la version au serveur
2 - Le serveur envoi au client une clef RSA 1024 bits publique
3 - Le client crypte le pseudo + mdp avec la clef RSA publique et renvoi le tout au serveur
4 - Le serveur décrypte les données avec la clef RSA privée ->>> SOUCIS

Voici les classes que j'utilise pour générer une clef puis pour décrypter le contenu envoyé par le Client : https://github.com/Velocity-/jWakfu/tree/master/src/com/velocity/jwakfu/crypto

Au niveau de mon code :

byte[] tableauRe = new byte[this.taillePaquet - 5]; // taillePaquet - 5 = 134

this.fluxEnEntree.readFully(tableauRe, 0, this.taillePaquet - 5); // Je réceptionne les infos cryptées envoyées par le client et je mets dans le tableau "tableauRe"

byte[] decoded = RSACertificateManager.INSTANCE.decode(tableauRe); // C'est ici que ça bloque



Voici le message d'erreur que j'ai :
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes

at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:346)

at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)

at javax.crypto.Cipher.doFinal(Cipher.java:1966)


at client.RSACryptoCipher.encode(RSACryptoCipher.java:51)

at client.RSACertificateManager.decode(RSACertificateManager.java:50)

at client.traiterPaquet.run(traiterPaquet.java:63)



EDIT : Après vérifications je pense que Ankama a changé le mode de cryptage des identifiants en passant d'une clef RSA 1024 bits à 1056 bits, car je reçois des identifiants cryptés sous 132 bytes. J'ai donc modifié la génération de ma clef RSA pour envoyer une 1056 bits au client mais j'obtiens toujours une erreur au moment de décrypter ce qui est envoyé par le client :
javax.crypto.BadPaddingException: Decryption error

at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)

at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)

at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:365)

at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:391)

at javax.crypto.Cipher.doFinal(Cipher.java:1966)

at client.RSACryptoCipher.encode(RSACryptoCipher.java:51)

at client.RSACertificateManager.decode(RSACertificateManager.java:50)



Merci aux âmes généreuses qui voudront bien m'aider :) !
 
Dernière édition:

suntyop

Contributeur
Inscrit
6 Avril 2016
Messages
17
Reactions
2
#2
Hello,
Bon j'ai fini par trouver... Les petits malins, ils ont changé les ID des paquets + l'ordre de sérialisation.
Pour ceux que ça intéresse (fonctionne sous la version 1.45 de WAKFU AVRIL 2016 ) :
1) Il faut bien envoyer une clef RSA au client de 1024 bits, l'ID du paquet est 1034. Le serveur envoi également 2 autres paquets (ID 110 et 08) qui sont inutiles jusqu'à preuve du contraire. Pas besoin de les envoyer. Il suffit d'envoyer le paquet 1034.
2) Le client envoi les informations (pseudo+mot de passe) encodées avec la clef RSA publique au serveur avec l'ID 1026.
3) Le serveur décrypte avec la clef privée... Attention, après le header les 4 premiers octets correspondent à la taille de la clef(128 bytes) soit 1024 bits. Les octets restants correspondent au message encodé avec la clef RSA (seule cette partie doit être décodée).
 
Dernière édition:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#3
Merci du partage
 
Haut Bas