Compatibilité 1.113

Section Française de l'emulateur Dawn of light.

Moderators: Support Team, Other Language Team

Re: [Script] Compatibilité 1.113

Postby Laplume » Fri May 31, 2013 12:27 pm

Bonjour tout le monde,

Je m'adresse à vous, car j'ai à nouveau besoin d'un petit coup de pouce.

Toujours dans le but de sécurisé la communication Client(version 1.109)/Serveur, j'ai étudié la théorie du cryptage RSA, et selon ce que j'ai appris, et si j'ai bien compris, une clé RSA d'une longueur X permet le décodage d'une donnée de longueur maximale de X également.

J'ai donc bricolé une nouvelle classe basée sur RSACryptoServiceProvider qui génère mes clés, j'ai pris une taille de clé de 3072 bits.

Les clés générées sont des string dont la structure est la suivante :

Privé :
Code: Select all
<RSAKeyValue><Modulus>vnf... ...RM=</Modulus> <Exponent>AQAB</Exponent> <P>9D0... ...uUUQ==</P> <Q>x6PZ... ...9S7HeIw==</Q> <DP>SWP7... ...+8B8OEQ==</DP> <DQ>oucTKS/... ...+2Fz0Vo5ixUaw==</DQ> <InverseQ>S4vdVp... ...A+EMCg==</InverseQ> <D>pb3fN... ...o1GHFSE=</D> </RSAKeyValue>
Public :
Code: Select all
<RSAKeyValue><Modulus>vnfeOZd... ...BLEhRM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
Au runtime, j'ai observer que les paquets qui doivent êtres décodés avec l'RSA ont une longueur de 2048 bytes, donc en théorie il me faudrait une clé RSA de 16384 bit, ce qui prend un temps dingue pour la génération.

J'ai également observé que ces paquets ont une petite quantité de données, max 262 bytes et le reste que des 0.

J'ai donc repris la valeur du paramètre "numBytes" de la fonction "PacketProcessor.ReceiveBytes", que je passe en paramètre à ma fonction "DecryptPacket", ainsi, je réduis la taille du message (byte[]) à décodé à sa taille minimale, et ma clé de 3072 bits devrait avoir une longueur suffisante pour décodé.

J'ai sniffé les données qui passent sans cryptage et avec cryptage, et effectivement, après avoir envoyé la clé publique au client, la 1er donnée qui arrive au serveur n'a plus la même structure qu'auparavant, j'en déduis que le client l'a crypté.

Le problème est que lors du décodage de cette donnée, j'ai une exception "Bad Data", et je me demande d'ou ça peu venir.

J'ai observé le code de TomCryptLib, et j'ai constaté que les clés qu'il génère sont purement numériques, alors que chez moi elles sont en ASCII structuré XML.

Je me suis donc dit qu'envoyé au client une clé publique avec les "<RSAKeyValue><Modulus>" et "=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>" pouvait être mal interprété, j'ai donc supprimé cela de la clé, et j'envois uniquement la suite de caractères, mais même problème, "Bad Data" lors du décryptage.

Alors avant de m'attaquer à l'implémentation de l'algorithme RSA afin de générer des clés purement numériques avec des biginteger, je passe par ce forum, au cas où qqn aurait une idée pour me débloquer.

La clé publique envoyée au client subit un changement, vu que c'est un string à la base, je la passe en char[] avec la fonction "maClé.ToCharArray()", et ensuite :
Code: Select all
publicKey = Encoding.ASCII.GetBytes(myPublicKey); // publicKey est un tableau de byte pak.WriteShort((ushort)publicKey.Length); pak.Write(publicKey, 0, publicKey.Length); SendTCP(pak, true);
Voici ce que j'ai avec le packetlogger :
Code: Select all
00:00:00.000 S<=C 0xF4 crypt key request v186 (keyLenght:0 rc4Enabled:0 clientTypeAndAddons:0xF6 clientVersion:1.10.9 client:Labyrinth expantions:, NewFrontiers, Foundations(Housing)) 00:00:00.110 S=>C 0x22 version and crypt key v186 (encryption:1 isSI:0x32 majorVersion:1 minorVersion:10 build:0 keyLenght:0) not initialized data from pos 5 (514): (0x02,0x00,0x76,0x57,0x4F,0x59,0x4A,0x61,0x44,... ... ,0x4D,0x56) 00:00:00.250 S<=C 0xF4 crypt key request v186 (keyLenght:64 rc4Enabled:1 clientTypeAndAddons:0xF6 clientVersion:1.10.9 client:Labyrinth expantions:, NewFrontiers, Foundations(Housing)) 00:00:00.328 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:00:10.359 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:00:20.359 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:00:30.405 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:00:40.405 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:00:50.420 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............) 00:01:00.420 S<=C 0xA7 login request v1104 (|1109|monCompte|monPass|...............)
[Édit] petite précision : je décrypte le paquet entier, contrairement au scripte de TomCrypt qui lui les splitte je ne s’ai spas trop pourquoi, et puis il décrypte block par block.

D'avance merci à vous :mrgreen:
User avatar
Laplume
DOL Visitor
 
Posts: 7
Joined: Mon Feb 07, 2011 10:34 am

Re: [Script] Compatibilité 1.113

Postby Leodagan » Tue Feb 28, 2017 8:06 am

Bon je tente un "Bump", même si c'est moche, c'est toujours d'actualité ;)

A voir si on pourrait pas aussi réessayer une implémentation dans les version 1.109 et inférieures !
User avatar
Leodagan
Developer
 
Posts: 1350
Joined: Tue May 01, 2012 9:30 am
Website: https://daoc.freyad.net
Location: Lyon

Re: [Script] Compatibilité 1.113

Postby HunabKu » Tue Feb 28, 2017 8:21 am

C'est moche que quand c'est inutile, ce qui n'est absolument pas le cas ici.
"C'est l'ignorance qui apporte le chaos, pas la connaissance."
Scarlett Johansson dans "Lucy" de Luc Besson
-------------------------------------------------------------------------------
"Ignorance brings chaos, not knowledge."
Scarlett Johansson on "Lucy" by Luc Besson
User avatar
HunabKu
Developer
 
Posts: 1905
Joined: Sat Jun 18, 2011 4:48 am


Return to “%s” Français

Who is online

Users browsing this forum: No registered users and 1 guest