Packet 110 - DecodeWithAES()

Inscrit
13 Avril 2016
Messages
27
Reactions
0
#1
Salut a tous,
Je continue dans ma quête d'apprentissage en full socket et je bute sur un nouveau problème.
C'est sur le packet 110, le serveur ne me répond pas et me kick après que je lui est envoyé.



Le problème se trouve certainement dans mon decodeWithAES() donc voilà le code :

C#:
        public static string decodeWithAES(byte[] ticket)
        {
            DataReader dr = new DataReader(AESKey);
            AesManaged aesAlg = new AesManaged();

            aesAlg.IV = dr.ReadBytes(16);
            aesAlg.Key = AESKey;
            aesAlg.Padding = PaddingMode.None;
            aesAlg.Mode = CipherMode.CBC;

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            MemoryStream msDecrypt = new MemoryStream(ticket);
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
            StreamReader srDecrypt = new StreamReader(csDecrypt);
            return srDecrypt.ReadToEnd();
        }
Si j'ai bien compris le procéder on balance le ticket (en byte[]) du packet 42 dans le decodeWithAES() qu'on transforme en string, puis on renvoi cette chaîne de caractère dans le packet 110, c'est bien ça ?

La chaîne en sortie semble correctement formaté sans caractères illisible : "555d2d4c2519b0d9f9d3ac6c5e9a37bc".

Merci pour votre aide ! =D
 
Dernière édition:
Inscrit
18 Février 2015
Messages
228
Reactions
7
#2
Je crois que c'est 32 et non 16 bits mais je suis pas sur
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#3
Pour le ReadBytes ?

J'ai lu sur un autre post que "IV" c'est les 16 premiers bytes de la AESKey.
Puis par défaut elle a une taille de 16.

Donc je ne pense pas que c'est ça le problème.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#4
Hello,

essaye quelque chose comme ça:

C#:
using (Aes decryptor = Aes.Create())
{
  decryptor.Mode = CipherMode.CBC;
  decryptor.Padding = PaddingMode.None;
  decryptor.Key = AESKey;
  decryptor.IV = dr.ReadBytes(16);


  using (MemoryStream ms = new MemoryStream())
  {
       using (CryptoStream cs = new CryptoStream(ms, decryptor.CreateDecryptor(), CryptoStreamMode.Write))
       {
           cs.Write(cipherBytes, 0, cipherBytes.Length);
           cs.Close();
        }

        gameTicket = System.Text.Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
  }
}
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#5
Merci de t'a réponse, mais j'ai fais des tests et ton code sort exactement la même chaîne a la fin que le mon code...
Donc je me fais toujours kick du serveur :/

Je sais plus trop quoi faire, je l'avoue ^^
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#6
c'est bien la même clef que celle que tu utilises dans les credentials ?
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#7
Oui, la même.

J'ai même effectué des test pour vérifier si elle était exactement pareille quand j'appelle cette fonction.

Edit : J'ai bien vérifier mon SelectedServerDataMessage, et mon ticket est bien récupéré de la bonne manière, et c'est bien la même qui est envoyé dans la fonction.

Edit 2: Bon je le poste quand même on sait jamais si je suis aveugle.
C#:
        public static int ServerId;
        public static string address;
        public static int port;
        public static bool canCreateNewCaracter;
        public static byte[] ticket;

        public void deserialize_SelectedServerDataMessage(DataReader dr)
        {
            ServerId = dr.ReadVarShort();
            address = dr.ReadUTF();
            port = dr.ReadUInt16();
            canCreateNewCaracter = dr.ReadBool();
            int local2 = dr.ReadVarInt();
            ticket = new byte[local2];
            int i = -1;
            while (++i < local2)
                ticket[i] = dr.ReadByte();
        }
 
Dernière édition:
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#8
J'ai trouvé le problème, j'ai pas encore vérifier mais je assez sûr que c'est ça.
Ça vient de ma classe qui écrit le header du packet.
Dès que la valeurs décimal de mes 2 premiers bytes est plus grande que 255, mon premier byte était toujours a 0.

EDIT : Piouuuuf, le problème vient bien de là. 2 Jours a coincé pour ça...
Merci de m'avoir aidé tous de même ! :)
 
Dernière édition:
Haut Bas