Salut à tous.
Je ne sais pas si ce post va être utile, mais au cas où certains d'entre vous aient décidé de coder leur bot en as3, voici une solution pour mettre à jour la nouvelle connexion RSA.
Pourquoi parler de solution me direz-vous puisque dans un bot en as3, on a directement toutes les sources du jeu en as3 ?
C'est vrai, mais la décompilation avec S*think swf decompiler (qui à mon sens est pourtant le meilleur disponible) laisse tout de même de graves cicatrices dans le code, parfois irréparables. Pour ne pas avoir à se creuser trop, il suffit de télécharger la librairie as3Crypto (le fameux package "Hurlant") en sources et non pas en swc, car on va devoir y apporter une toute petite modif.
Donc après avoir téléchargé as3Crypto, vous vous retrouvez avec un nouveau dossier "hurlant" qu'il vous suffit de mettre à la place de celui de D*fus (com.hurlant). Gardez tout de même une copie de l'original, on ne sait jamais. Le nouveau dossier "hurlant" contient quelques fichiers en plus, mais cela n'est pas très grave.
La subtilité est ici maintenant ; ça fait deux jours que je m'arrache les cheveux en cherchant d'où venait l'erreur.
Ouvrez le fichier com.hurlant.util.der.PEM.as et, dans la fonction :
public static function readRSAPublicKey(str:String):RSAKey
mettez en commentaire la ligne :
public static function readRSAPublicKey(str:String):RSAKey {
var der:ByteArray = extractBinary(RSA_PUBLIC_KEY_HEADER, RSA_PUBLIC_KEY_FOOTER, str);
if (der==null){
return null;
}
var obj:* = DER.parse(der);
if (obj is Array) {
var arr:Array = obj as Array;
// arr[0] = [ <some crap that means "rsaEncryption">, null ]; ( apparently, that's an X-509 Algorithm Identifier.
if (arr[0][0].toString()!=OID.RSA_ENCRYPTION) {
return null;
}
// arr[1] is a ByteArray begging to be parsed as DER
//arr[1].position = 1; <-- CETTE LIGNE A METTRE EN COMMENTAIRE
obj = DER.parse(arr[1]);
if (obj is Array) {
arr = obj as Array;
// arr[0] = modulus
// arr[1] = public expt.
return new RSAKey(arr[0], arr[1]);
} else {
return null;
}
} else {
// dunno
return null;
}
}
Après cela, tout doit fonctionner.
A la réception du 3 : HelloConnectMessage, vous construisez le 4 : IdentificationMessage :
var recObjet:HelloConnectMessage = new HelloConnectMessage();
recObjet.deserialize(data);
//recuperation de la clé
var key:String = recObjet.key;
var lva:LoginValidationAction = LoginValidationAction.create(this._nomDeCompte, this._motDePasse, true);
var am:AuthentificationManager = AuthentificationManager.getInstance();
am.setValidationAction(lva);
am.setConnectionKey(key);
var envObjet:IdentificationMessage = am.getIdentificationMessage();
Atlantide