BlueMan
Invité n'ayant pas de compte PHPfrance
18 nov. 2009, 19:45
Re-bonjour.
Voici les fonctions dont tu as besoin :
ATTENTION : il faut que tu programme en PHP en gérant les exceptions : c'est beaucoup plus facile, propre, bref, c'est le MUST.
En PHP :
Pour générer une clé aléatoire en HEXA :
// Copyright BlueMan - Tous droits réservés.
// Utilisation gratuite pour des applications NON COMMERCIALES SEULEMENT.
function GetRandomHexaBytes($Nb)
{
$Code = "";
if ($Nb<1) {Throw New Exception('GetRandomHexaBytes($Nb) : Le paramètre »Nb est invalide.');}
for ($i=0; $i < $Nb; $i++) { $Code = $Code.sprintf("%02X",mt_rand(0,255)); }
return $Code;
}
Pour crypter le message avec la clé :
// Copyright BlueMan - Tous droits réservés.
// Utilisation gratuite pour des applications NON COMMERCIALES SEULEMENT.
function OTPCyclicNormalToHex(&$Message, &$HexKey)
{
// Réalisation d'un OTP avec, si la clé est moins longue que le message,
// une boucle cyclique reprenant la clé au début autant de fois que nécessaire.
// Dans la majorité des cas, on fournira une clé de même longueur que le
// message à coder afin de garantir une sécurité ABSOLUE.
$Result = "";
if ($Message == "") {Throw New Exception('OTPCyclicNormalToHex(&$Message, &$HexKey) : Le paramètre »Message est vide.');}
if ($HexKey == "") {Throw New Exception('OTPCyclicNormalToHex(&$Message, &$HexKey) : Le paramètre »HexKey est vide.');}
$LgMes = StrLen($Message);
$LgHexKey = StrLen($HexKey);
$PosKey = 0;
for ($i=0; $i<$LgMes; $i++)
{
$KeyByte = HexToInt($HexKey[$PosKey].$HexKey[$PosKey+1]);
$MesByte = Ord($Message[$i]);
$Result = $Result.sprintf("%02X",$MesByte ^ $KeyByte);
$PosKey += 2;
if ($PosKey == $LgHexKey) {$PosKey = 0;}
}
return $Result;
}
Pour récupérer la clé en Javascript avec un objet XMLHttpRequest :
// Copyright BlueMan - Tous droits réservés.
// Utilisation gratuite pour des applications NON COMMERCIALES SEULEMENT.
var LaCleRecue = "";
function GetKeyForHTML_K()
{
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
var method = "POST";
// Ici tu indique le script PHP qui va envoyer la clé par un echo
var ScriptName = "/LeScriptPHPQuiEnvoieLaCle.php";
var data = '';
xhr_object.open(method, ScriptName, true);
xhr_object.onreadystatechange = function()
{
if(xhr_object.readyState == 4)
{
LaCleRecue = xhr_object.responseText;
if (LaCleRecue == "") {alert("ERREUR : clé non reçue");}
// Destiné à te permettre de lancer une fonction de callback
// Tu nomme cette fonction : OnAfterKeyReceived()
// Grâceauc code suivant, c'est automatique : si tu n'en défini pas, cela ne plante pas
if (typeof(OnAfterKeyReceived) == 'function')
{
OnAfterKeyReceived();
}
}
}
if(method == "POST") { xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); }
xhr_object.send(data);
}
Pour décrypter le message en Javascript :
// Copyright BlueMan - Tous droits réservés.
// Utilisation gratuite pour des applications NON COMMERCIALES SEULEMENT.
function OTP(MessageK, HexaKey)
{
var Message = "";
LgMK = MessageK.length;
LgHexaKey = HexaKey.length;
PosKey = 0;
for (i=0;i<LgMK;i=i+2)
{
KeyByte = parseInt(HexaKey.charAt(PosKey) + HexaKey.charAt(PosKey+1),16);
MesByte = parseInt(MessageK.charAt(i) + MessageK.charAt(i+1),16);
Message = Message + String.fromCharCode(MesByte ^ KeyByte);
PosKey = PosKey + 2;
if (PosKey == LgHexaKey) {PosKey = 0;}
}
return Message;
}
Et ne pas oublier ceci ensuite :
// ATTENTION ! : Après l'appel à la fonction de décodage OTP, il faut impérativement détruire la clé reçue !!!
LaCleRecue = "";
Voilà.
Avec tout ça, tu devrais t'en sortir facilement.
BlueMan.
(
http://www.blueman.name)