Connection FullSocket (RSA)

Inscrit
20 Juin 2016
Messages
41
Reactions
2
#1
Bonjour,

Je suis entrain d'essayer de me connecter en full socket, seulement je bloque dès le début avec le cryptage RSA malgré mes recherches qui m'amène sur des liens morts le plus souvent.

Dans le AuthentificationManager on a ça :

Code:
      public function setPublicKey(param1:Vector.<int>) : void
      {
         var commonMod:Object = null;
         var publicKey:Vector.<int> = param1;
         var baSignedKey:ByteArray = new ByteArray();
         var i:int = 0;
         while(i < publicKey.length)
         {
            baSignedKey.writeByte(publicKey[i]);
            i++;
         }
         baSignedKey.position = 0;
         var key:ByteArray = new ByteArray();
         var readKey:RSAKey = PEM.readRSAPublicKey((new this._verifyKey() as ByteArray).readUTFBytes((new this._verifyKey() as ByteArray).length));
         try
         {
            readKey.verify(baSignedKey,key,baSignedKey.length);
         }
         catch(e:Error)
         {
            commonMod = UiModuleManager.getInstance().getModule("Ankama_Common").mainClass;
            commonMod.openPopup(I18n.getUiText("ui.common.error"),I18n.getUiText("ui.server.authentificationImpossible"),[I18n.getUiText("ui.common.ok")]);
            return;
         }
         this._publicKey = "-----BEGIN PUBLIC KEY-----\n" + Base64.encodeByteArray(key) + "-----END PUBLIC KEY-----";
      }
Si j'ai bien compris cette ligne
Code:
var readKey:RSAKey = PEM.readRSAPublicKey((new this._verifyKey() as ByteArray).readUTFBytes((new this._verifyKey() as ByteArray).length));
sert juste à avoir la clé public contenu dans les fichiers du jeu

Que j'ai traduit en :
Java:
String pKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9XpbSNEUoM6niz3XTESWJ/I3+h3J+YseUIdEShxyp0nMfX8xUHUktK/QFY+V4Q3fV/pdn1PxOaxKEA8SYGNAnc+uIal9ZGHqkbFcNF7CNp0MUFecQi5gGYpg4JPlC0onfmn6R2shSAl7M+UCVgFpICVrtXxocos/jg0OP/2gWFZU8AjKDo4JJP/apvubjUgufCGNXEWynRkOclMBXpAw2IBAO6KjRdGBllPmJfYcSQq+G+9tp5nK+dzkLgITSg8JtK2tp5w+fbt5tBlCLcvC/7CAp9t3J+ZImOO5kRw+Cn4Jd2RUMcPCd7s1JHqRXfOtuItz7xcOlqHtyLExvotfMwIDAQAB";
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pKey));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec);
Et cette ligne
Code:
readKey.verify(baSignedKey,key,baSignedKey.length);
sert à décrypter la clé que le HelloConnectMessage nous envoie pour la réutiliser plus tard.

Si j'ai tout compris jusqu'à là je bloque par la suite car la taille de la clé public est de 305 or il faut pour décrypter du RSA faut une taille de 256.
 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#2
C'est un peut confus tout cela, c'est des tailles en quoi que tu mesures ?

Du coup je te donne des infos en vrac, en espérant que cela t'aide :
  • Les tailles des clef en cryptographie sont données en bits;
  • les algo utilisés par le jeu sont : RSA et AES;
  • En RSA, on n'utilise pas des clefs de 256bit, et il est déconseillé d'utiliser des clefs de 1024bit; Il me semble que le jeu utilise des clef de 2048bit;
  • En AES on utilise des clef de de taille 128 ou 192 ou 256 bits; le jeu utilise des clef de 256bit;
  • Si tu regardes la taille des données en base64, tu vas compter des octets et cela ne va donc pas correspondre à la taille en bit, il faut appliquer un rapport 6;
  • Dans une clef RSA public, il y en, plus de la clef elle même, des informations sur la clef, du coup c'est peu pertinent de mesurer la taille directement;
  • Si tu veut obtenir des informations (comme la taille) précise concernant une clef RSA, tu peut utiliser openssl (ou d'autre outil qui sont moins critiqué, mais l'idée est là);
  • La donnée envoyé par le serveur est une clef public signé, pour retirer la signature, et obtenir la clef public à utiliser, il faut lui appliquer un algo de vérification (verify);
Si tu veut bien comprendre la procédure tu peut la faire 'à la main' avec openssl dans un premier temps, et en suite faire ton code.
 
Dernière édition:
Inscrit
20 Juin 2016
Messages
41
Reactions
2
#3
Merci de ta réponse déjà, j'ai essayer de voir de mon côté mais rien à faire je n'arrive pas à comprendre là où je bloque et où chercher

C'est un peut confus tout cela, c'est des tailles en quoi que tu mesures ?
C'est la taille d'un tableau de byte, le nombre de byte en gros

  • En RSA, on n'utilise pas des clefs de 256bit, et il est déconseillé d'utiliser des clefs de 1024bit; Il me semble que le jeu utilise des clef de 2048bit;
Ce qui correspond à 256 byte :)

La donnée envoyé par le serveur est une clef public signé, pour retirer la signature, et obtenir la clef public à utiliser, il faut lui appliquer un algo de vérification (verify);
L'algo verify me retourne que des valeurs nulles, et ce que je trouve sur les signatures en cherchant c'est une donnée "à part", qui n'est pas combiné à des données
 

BlueDream

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

Ta PublicKey m'a intrigué puisque la mienne est différente de la tienne et pourtant ma connexion se déroule sans problème.
Je suis allé chercher dans les sources et j'ai pu trouvé la même que la tienne, mais avec celle-ci le Verifiy() ne passe pas non plus chez moi.

Tu devrais essayer avec la mienne:
Code:
MIIBUzANBgkqhkiG9w0BAQEFAAOCAUAAMIIBOwKCATIAgucoka9J2PXcNdjcu6CuDmgteIMB+rih2UZJIuSoNT/0J/lEKL/W4UYbDA4U/6TDS0dkMhOpDsSCIDpO1gPG6+6JfhADRfIJItyHZflyXNUjWOBG4zuxc/L6wldgX24jKo+iCvlDTNUedE553lrfSU23Hwwzt3+doEfgkgAf0l4ZBez5Z/ldp9it2NH6/2/7spHm0Hsvt/YPrJ+EK8ly5fdLk9cvB4QIQel9SQ3JE8UQrxOAx2wrivc6P0gXp5Q6bHQoad1aUp81Ox77l5e8KBJXHzYhdeXaM91wnHTZNhuWmFS3snUHRCBpjDBCkZZ+CxPnKMtm2qJIi57RslALQVTykEZoAETKWpLBlSm92X/eXY2DdGf+a7vju9EigYbX0aXxQy2Ln2ZBWmUJyZE8B58CAwEAAQ==
 
Inscrit
20 Juin 2016
Messages
41
Reactions
2
#5
En utilisant la bonne clef ça marche, merci
 
Haut Bas