crypter une chainne ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : crypter une chainne ?

Les fonctions dont tu as besoin

par BlueMan » 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)

Re: crypter une chainne ?

par kalil » 18 nov. 2009, 16:49

Merci beaucoup c'est très complet comme explication .Je vais mi mettre se soir .

Re: crypter une chainne ?

par BlueMan » 18 nov. 2009, 05:51

Bonjour.

La meilleure solution reste le One Time Pad (OTP) :

- Tu génère une Clé aléatoire faite d'une suite de valeurs entre 0 et 255 avec la fonction PHP : mt_rand(0,255)
- Tu la converti en une chaine : une suite hexadécimale
- Tu sauvegarde cette Clé dans ta Session
- Tu crypte tes données (appelées par la suite "le Message") par un OTP :

Message_Crypté = OTP(Message, Clé) selon le principe :

Octet_Message_Crypté = Octet_Message ^ Octet_Clé (^ signifie "XOR", le OU exclusif)

Tu balance ton URL :

Code : Tout sélectionner

http://www.MonServeur.com/MaPageDeDestination.php?mesk=Le_Message_Crypté_en_HEXA
Dans ta page MaPageDeDestination.php tu récupère ta clé par la Session et du décrypte par un OTP de la même façon, car OTP°OTP = Identité, à savoir :

Octet_Message = Octet_Message_Crypté ^ Octet_Clé

Puis tu détruit la Clé.

Si ta page MaPageDeDestination.php doit recevoir la clé au niveau du Client, alors tu utilise un XMLHttpRequest pour demander la Clé qui te sera donnée par un script PHP qui te l'envoie en la récupérant dans la Session puis qui la détruit immédiatement par un UnSet.

Dans le Javascript de MaPageDeDestination, tu procède pareillement au décodage et tu détruit immédiatement après le contenu de la variable Javascript qui contenait la Clé en l'affectant à "", par exemple.

Et le tour est joué !

Précision importante : OTP est mathématiquement INDÉCODABLE (cela a été à mainte fois vérifié, démontré, prouvé) tant qu'à chaque fois tu génère une nouvelle clé aléatoire. D'un point de vue théorique, il faudrait utiliser un générateur aléatoire parfait, mais pour ton application la fonction mt_rand() est bien suffisante...

Amuse toi bien !

BlueMan.

Re: crypter une chainne ?

par kalil » 17 nov. 2009, 01:11

Bonsoir,
j'ai dans mon cas , la bibliothèque mcrypt ferait l'affaire, mais je ne sais pas trop quel fonction choisir :/
je passe en url un lien et un id . genre , www.monsite.fr/index.php?id=12345&l=www.google.fr .
je veut crypter l'id et le liens pour que l'utilisateur ne peut pas comprendre les valeurs .Et si possible , les chaines crypter ne soit pas trop longue .
Vous me conseiller quel fonction ?
merci beaucoup d'avance .

Re: crypter une chainne ?

par Ryle » 16 nov. 2009, 23:01

Euh.... attention... urlencode() est une fonction permettant d'encoder une chaine de caractères pour qu'elle puisse être transmise via une url. En gros, elle va encoder les caractères spéciaux pour les rendre compatibles, mais ça ne va strictement rien "crypter".

Si tu veux crypter/décrypter une chaine, penches toi plutôt du côté des fonctions de la librairie mcrypt de php :)

Re: crypter une chainne ?

par kalil » 16 nov. 2009, 20:12

Merci beaucoup ! :)
Pour valider tes pages, n'oublie pas d'encoder l'esperluette.
je n'ai pas trop compris cette phrase #-o
merci encore

Re: crypter une chainne ?

par niuxe » 16 nov. 2009, 20:03

Hello Kalil,
salut,
je veut passer dans un url deux variable , une chaine de caractère et une chaine d'entier .y a il une fonction prète dans php pour les crypter et de les décrypter dans la page où je les reçoit ?
Oui en effet il y a deux fonctions :
* urlencode()
* urldecode()

Pour valider tes pages, n'oublie pas d'encoder l'esperluette. ;)
y a t-il une méthode pour que la chaine crypter ne soit pas trop longue ?
merci d'avance.
Je ne comprends pas bien ta question. Si ta chaine est trop longue, tu as la possibilité d'envoyer un cookie par exemple. Par contre, cela dépend du cas, bien sûr.

Bon code

crypter une chainne ?

par kalil » 16 nov. 2009, 19:34

salut,
je veut passer dans un url deux variable , une chaine de caractère et une chaine d'entier .y a il une fonction prète dans php pour les crypter et de les décrypter dans la page où je les reçoit ?
y a t-il une méthode pour que la chaine crypter ne soit pas trop longue ?
merci d'avance .