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

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

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.