Cryptage/décryptage aléatoire (one time password)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 484 fois - Téléchargée 32 fois

Contenu du snippet

Bah bah... il s'agit d'une technique que j'ai pondue ce matin (???! J'ai rien inventé, je sais!) pour crypter/décrypter un texte de manière à ce que ce ne soit jamais le même cryptage, contrairement à ce que fait un système comme SHA-1 ou MD5.
C'est tout bête:
- génération d'un seed
- msg XOR seed
et c'est tout!

Pour décrypter, on fait crypt XOR seed (forcément, avec XOR, l'avantage c'est que a XOR b XOR b ça fait a !)

Voilà! C'est pour les paranos du mail ou de la connexion à une bd, sinon je vois pas à quoi ça sert comme ça ;o)

Source / Exemple :


-- formulaire pour insérer le texte à crypter

<HTML><TITLE>CRYPTAGE SYMETRIQUE</TITLE>
<BODY bgcolor=#ccddee>
Seuls les caractères suivants sont acceptés: <B>ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;-@</B><BR />
<FORM action="hex2.php" method="post">
<textarea name="texte" rows="20" cols="40"></textarea>
<input type="submit" name="valider" value="Valider">
</form>
</BODY></HTML>

-- fichier hex2.php pour crypter/décrypter

<?php

// Entrées de la fonction convert_dec: le message et le tableau 
// qui retournera les positions dans l'alphabet
function convert_dec($msg,&$dec){
	
	$size = strlen($msg);
	$lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;-@";
	
	for ($i=0;$i<$size;$i++){
		switch(substr($msg,$i,1)){
			case 'A': $dec[$i] = 0; break;
			case 'B': $dec[$i] = 1; break;
			case 'C': $dec[$i] = 2; break;
			case 'D': $dec[$i] = 3; break;
			case 'E': $dec[$i] = 4; break;
			case 'F': $dec[$i] = 5; break;
			case 'G': $dec[$i] = 6; break;
			case 'H': $dec[$i] = 7; break;
			case 'I': $dec[$i] = 8; break;
			case 'J': $dec[$i] = 9; break;
			case 'K': $dec[$i] =10; break;
			case 'L': $dec[$i] =11; break;
			case 'M': $dec[$i] =12; break;
			case 'N': $dec[$i] =13; break;
			case 'O': $dec[$i] =14; break;
			case 'P': $dec[$i] =15; break;
			case 'Q': $dec[$i] =16; break;
			case 'R': $dec[$i] =17; break;
			case 'S': $dec[$i] =18; break;
			case 'T': $dec[$i] =19; break;
			case 'U': $dec[$i] =20; break;
			case 'V': $dec[$i] =21; break;
			case 'W': $dec[$i] =22; break;
			case 'X': $dec[$i] =23; break;
			case 'Y': $dec[$i] =24; break;
			case 'Z': $dec[$i] =25; break;
			case ' ': $dec[$i] =26; break;
			case '.': $dec[$i] =27; break;
			case ',': $dec[$i] =28; break;
			case ';': $dec[$i] =29; break;
			case '-': $dec[$i] =30; break;
			case '@': $dec[$i] =31; break;
		}
	}
			
}

// Entrées de la fonction convert_str: le tableau des positions dans l'alphabet,
// la taille du string et le string en retour

function convert_str($tab,$size,&$str){
	
	$str = "";
	for ($i=0;$i<$size;$i++){
		switch($tab[$i]){
			case '0' : $str .="A"; break;
			case '1' : $str .="B"; break;
			case '2' : $str .="C"; break;
			case '3' : $str .="D"; break;
			case '4' : $str .="E"; break;
			case '5' : $str .="F"; break;
			case '6' : $str .="G"; break;
			case '7' : $str .="H"; break;
			case '8' : $str .="I"; break;
			case '9' : $str .="J"; break;
			case '10': $str .="K"; break;
			case '11': $str .="L"; break;
			case '12': $str .="M"; break;
			case '13': $str .="N"; break;
			case '14': $str .="O"; break;
			case '15': $str .="P"; break;
			case '16': $str .="Q"; break;
			case '17': $str .="R"; break;
			case '18': $str .="S"; break;
			case '19': $str .="T"; break;
			case '20': $str .="U"; break;
			case '21': $str .="V"; break;
			case '22': $str .="W"; break;
			case '23': $str .="X"; break;
			case '24': $str .="Y"; break;
			case '25': $str .="Z"; break;
			case '26': $str .=" "; break;
			case '27': $str .="."; break;
			case '28': $str .=","; break;
			case '29': $str .=";"; break;
			case '30': $str .="-"; break;
			case '31': $str .="@"; break;
		}
	}
}

// Fonction pour générer le seed

function generateSeed($size, &$seed){

	$lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;-@";
       
	$seed = "";
	for ($i=0;$i<$size;$i++){
	$seed .= substr($lettres, (md5((time()*rand()))%($size))%32, 1);
                    }
}

// Fonction de cryptage en utilisant XOR

function cryptXor($mssg,$seed,&$crypted){

	$size = strlen($mssg);
	convert_dec($mssg,$dec_mssg);
	convert_dec($seed,$dec_seed);
	
	// message XOR seed

	for ($i=0;$i<$size;$i++){
		$crypt[$i] = ($dec_mssg[$i] ^ $dec_seed[$i])%32;
	}
	
	//Conversion du résultat du XOR en décimal

	convert_str($crypt,strlen($mssg),$crypted);
}

function decryptXor($crypted,$seed,&$decrypted){

	$size=strlen($crypted);
	convert_dec($crypted,$dec_crypted);
	convert_dec($seed,$dec_seed);
	
	for ($i=0;$i<$size;$i++){
 		$decrypt[$i] = ($dec_crypted[$i] ^ $dec_seed[$i])%32;
	}

	convert_str($decrypt,$size,$decrypted);
}

$mssg = $_POST['texte'];
$size = strlen($mssg);

generateSeed($size,$seed);

cryptXor($mssg,$seed,$crypted);

decryptXor($crypted,$seed,$decrypted);

echo "Message: ".$mssg."<BR /><BR />";
//echo "Seed   : ".$seed."<BR />";
echo "Crypted: ".$crypted."<BR /><BR />";
echo "Decrypt: ".$decrypted."<BR />";
?>

Conclusion :


C'est basé sur l'alphabet ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;-@

Un exemple d'exécution:

Pour le message "KENNST DU DAS LAND WO DIE ZITRONEN BLUHEN" (c'est bô, c'est de Johann Wolfgang von Goethe ;o)) on a une fois:
Message: KENNST DU DAS LAND WO DIE ZITRONEN BLUHEN
Crypted: KELNK Y -DIS-LANBKWYNDIAH-ITDOFENYFJTHDF
Decrypt: KENNST DU DAS LAND WO DIE ZITRONEN BLUHEN

Une autre fois:
Message: KENNST DU DAS LAND WO DIE ZITRONEN BLUHEN
Crypted: KEQGUT DU AEN@.YK,XWK QOA OITROHEM-CLUUNN
Decrypt: KENNST DU DAS LAND WO DIE ZITRONEN BLUHEN

A voir également

Ajouter un commentaire

Commentaires

Messages postés
37
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
4 février 2006

Code intéressant, c'est sur que ca n'a rien à voir avec les cryptages DES et compagnie mais pour quelqu'un qui souhaite un petit cryptage sans avoir à installer l'extension mcrypt c'est très utile.

Je met donc 8/10 à cette source ;)
Messages postés
5
Date d'inscription
samedi 15 janvier 2005
Statut
Membre
Dernière intervention
15 août 2006

Je n'ai lu que le début des réponses mais je me permets simplement de signaler qu'à chaque situation correspond un cryptage en conquéquence... Si vous ne voulez pas que votre petite soeur de 4 ans décrypte des conneries que vous protégez, un cryptage façon César suffira :D
Le cryptage XOR, j'en ai fait un en VB parce que je voulais crypter n'importe quel type de fichier (1Mo à 20Go on va imaginer... ^^) et parce que le projet devait être présenté à un examen sans être "trop important" en terme de lignes de code.
Maintenant, félicitation pour ton code, il est intéressant ! Je met 8/10
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
si tu stockes le seed et en bricolant un peu... oui!
Messages postés
6
Date d'inscription
dimanche 4 décembre 2005
Statut
Membre
Dernière intervention
30 décembre 2005

huum je dois avouer que je n'ai pas vraiment pris le temps de lire toute cette guguerre "intélectuelle" mais j'aurais une question bete ( surtout) et méchante:
si j'utilise ton script pour crypter un mot de pass a mettre dans une base de données je peux ensuite le décrypter ??? plus tard, par exemple lors d'un login ?
si c'est le cas ton script m'intéresse pas mal
slut
Messages postés
5
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 septembre 2009

bonjour,

Ce script est super pour moi car , j'ai besoin de crypter un texte en php , et de le décrypter le texte lu par une application VB (il faut donc que je puisse convertir cette fonction en vb).

Donc, je sais qu'il existe la biblio mcrypt en php, mais pour avoir la même chose en vb, c'est plus dur a trouver.

Mon besoin est simple :
- j'ai une appli vb qui interroge une page html
- Cette page est générer par un script php qui affiche des données cryptées
- les données sont lues par l'appli
- puis l'appli les décrypte.

Voila merci pour le script, je vais l'essayer, de plus il est facile a convertir en vb.


Nicolas
Afficher les 16 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.