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>
- Code: Select all
<RSAKeyValue><Modulus>vnfeOZd... ...BLEhRM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
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);
- 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|...............)
D'avance merci à vous