Divers

Mon Outil d'obfuscation

J'ai développé un outil d'obfuscation (encore un) pour éviter que les robots récupèrent certaines informations, comme mon adresse mail (et m'envahissent de spam). J'aurais pu utiliser une CAPTCHA (acronyme de "Completely Automated Public Turing test to Tell Computers and Humans Apart"), c'est à dire une image difficilement interprétable par un ordinateur. Mais j'ai choisi un mode plus textuel. Vous pouvez le tester en sélectionnant le menu "Contact". Mon adresse mail est interprétable par le navigateur (si JavaScript est bien activé pour cette page). Mais si vous affichez le fichier source (HTML), vous remarquerez que mon adresse n'est pas contenue en clair.

Une fonction PHP est chargée du chiffrement du message par un codage Vernam. Le message codé est inséré dans le code HTML. Il est ensuite déchiffré par une application JavaScript intégrée au code HTML et le message en clair est affiché par le navigateur.

Le principe du codage Vernam est relativement simple: le message est additionné (modulo la taille de l'alphabet) avec une chaîne de caractères aléatoires qui possède la même taille que le message à crypter. Si la chaîne de caractères est parfaitement aléatoire (ce qui est très rarement le cas) et qu'elle est utilisée une fois, ce chiffrement est théoriquement impossible à casser. On parle alors de masque jetable ou "One-Time Pad". Le choix de ce codage est basé sur le fait qu'il soit simple à écrire. Le but ici n'est pas de faire du cryptage mais de rendre la tâche plus lourde aux robots qui récupèrent les adresses mail pour pouvoir faire du spam. On remarque en effet que la clé secrète est envoyée aux navigateurs client.

Le code PHP de l'outil est présenté ci-dessous.

<?
$message="xxx@yyy";
$code=obfuscate($message);

if($code!==FALSE){
 echo '<SCRIPT type="text/javascript" language="javascript">';echo "\n";
 echo '<!--';echo "\n";
 echo 'alphabet="'.$code[0].'";';echo "\n";
 echo 'secret="'.$code[1].'";';echo "\n";
 echo 'cipher="'.$code[2].'";';echo "\n";
 echo 'result="";';echo "\n";
 echo "for(i=0;i<cipher.length;i++){\n";
 echo " position=alphabet.indexOf(cipher.charAt(i));\n";
 echo " if(position==-1) result+=cipher.charAt(i);\n";
 echo " else result+=";
 echo "alphabet.charAt((position-alphabet.indexOf(secret.charAt(i))+alphabet.length)%alphabet.length);\n";
 echo "}\n";
 echo 'document.write("<A href=\\"mailto:"+result+"\\">"+result+"</A>");';echo "\n";
 echo "//-->\n";
 echo "</SCRIPT>\n";
 echo "<NOSCRIPT>\n";
 echo "<BR/><STRONG>Adresse mail indisponible:</STRONG> Mon adresse mail est cachée mais déchiffrable par une fonction JavaScript. ";
 echo "<BR/>Le JavaScript doit être autorisé sur cette page.\n";
 echo "</NOSCRIPT>\n";
}
else{
 echo '<A href="mailto:',$message,'">',$message,'</A>';
}
?>

La fonction PHP obfuscate() est définie ci-dessous.

<?
function obfuscate($message){
 $alphabet="1234567890-=";
 $alphabet.="qwertyuiop";
 $alphabet.="asdfghjkl";
 $alphabet.="zxcvbnm,.";
 $alphabet.="!@#$%^&*()_+";
 $alphabet.="QWERTYUIOP";
 $alphabet.="ASDFGHJKL:";
 $alphabet.="ZXCVBNM?";
 $interdit="\"\\'";
 $secret="";
 $cipher="";

 if(empty($message)) return FALSE;
 for($i=0;$i<strlen($interdit);$i++){
  if(strpos($message,$interdit{$i})!==FALSE) return FALSE;
 }
 for($i=0;$i<strlen($message);$i++){
  $alea=rand(0,strlen($alphabet)-1);
  $secret.=$alphabet{$alea};
  $position=strpos($alphabet,$message{$i});
  if($position===FALSE) $cipher.=$message{$i};
  else $cipher.=$alphabet{($position+$alea)%strlen($alphabet)};
 }

 return array($alphabet,$secret,$cipher);
}
?>

mis à jour le 20/07/2009

Raccourcis