Algorithme de césar sur la table ascii

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 755 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour,

Alors voila, simple et basic, histoire d'apporté un regarde différent (Tout du moins par rapport aux codes du genre qui se compliquent la tête selon moi, dans phpcs) pour l'utilisation de l'algo de César sur la table Acsii.

Source / Exemple :


<?php 
#--------------------------------------------------------------------------------------------
#	Function cesar(string $word, int $offset, int $mode)
#
#	@$word    -> La chaine à encrypter ou decrypter;
#	@$offset  -> Le Nombre d'offset de decalage 
#       @$mode    -> 1 pour encrypter (Incrémenter), tout autre pour decripter (Decrementer)
#       return    -> La chaine $word altéré grace à la methode de césar d'apres les tables ascii
#
#   By Nementon, ---http://uwht.u7n.org---
#---------------------------------------------------------------------------------------------

function cesar($word, $offset, $mode) {
	$offset  = intval($offset);
	$mode    = intval($mode);
	$wLenght = strlen($word);
	$return  = '';
	
	if ($mode == 1 ) {
		for ($i = 0; $i < $wLenght; $i++) {
			// On recuperer le code ascii
			$tmpAscii = ord($word[$i]);
			// On ajoute à la chaine finale, la corespondance du code ascii recuperé incrementé de l'offset passé en parametre
			$return  .= chr($tmpAscii+$offset);
		}
	}
	else {
		for ($i = 0; $i < $wLenght; $i++) {
			$tmpAscii = ord($word[$i]);
			$return  .= chr($tmpAscii-$offset);
		}
	}
	return $return;
}
#--------------------------------------------------------------------------------------------
#	function cesar2(string $word, int $offset, int $mode)
#
#	@$word    -> La chaine à encrypter ou decrypter;
#	@$offset  -> Le Nombre d'offset de decalage 
#   @$mode    -> 1 pour encrypter (Incrémenter), tout autre pour decripter (Decrementer)
#   @return   -> La chaine $word altéré grace à la methode de césar d'apres les tables ascii
#
#---------------------------------------------------------------------------------------------
// Exemple de fonction césar un plus tortueuse
function cesar2($word, $offset, $mode) {
	$offset  = intval($offset);
	$mode    = intval($mode);
	$wLenght = strlen($word);
	$return  = '';
	
	if ($mode == 1 ) {
		for ($i = 0; $i < $wLenght; $i++) {
			// On recuperer le code ascii
			$tmpAscii = ord($word[$i]);
			$return  .= chr($tmpAscii+$offset+(($i*$wLenght)-$i));
		}
	}
	else {
		for ($i = 0; $i < $wLenght; $i++) {
			$tmpAscii = ord($word[$i]);
			$return  .= chr($tmpAscii-$offset-(($i*$wLenght)-$i));
		}
	}
	return $return;
}

	//Exemple :
	echo '<b>Cesar : </b><br />', cesar("abc", 666, 1), // Encrypte;
	'<br />', cesar("ûüý", 666, 2), '<br /><br />'; // Decrypte

       //Exemple  :
	$wEncrypte = cesar2("abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789", 666, 1);// Encrypte;
	echo '<b>Cesar 2 : <b/><br />', $wEncrypte, '<br />',  cesar2($wEncrypte, 666, 2); // Decrypte
?>

Conclusion :


Bon, un peu useless pour surement 97% d'entre vous, mais ce code source la m'aurait bien aidé à mes début ; )

Tous commentaires sont les bienvenus.

A voir également

Ajouter un commentaire

Commentaires

neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
12 -
Salut,

Toi aussi tu te compliques la vie ;)

for ($i=0; $i<$wLenght; $i++) {
$word[$i] = chr(ord($word[$i])+$offset);
}
return $word;

Le mode n'est pas utile : si on connait la valeur de $offset, il suffit de passer son opposé en argument.
Sinon, je crois que tu n'implémentes pas correctement l'algorithme de César, qui est pourtant d'une simplicité déconcertante...
http://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage
On décale toujours d'une valeur fixe : la valeur du décalage n'est pas fonction de la position du caractère dans la chaîne chiffrée, contrairement à ton implémentation. En fait, ton implémentation est à mi chemin entre le chiffre de César et le chiffre de Vigenère : un décalage fonction de la position du caractère dans la chaîne, mais sans clé (contrairement à Vigenère ou Vernam qui en utilisaient une).

En gardant l'argument $mode et en poussant un peu, on peut même utiliser la même boucle pour additionner ou soustraire :
<?php
function caesar ($string, $offset, $mode = 1) {
$len = strlen($string); $coeff (1 $mode) ? 1 : -1;
for($i=0 ; $i<$len ; $i++) {
$string[$i] = chr(ord($string[$i])+$offset*$coeff);
}
return $string;
}
?>

Désolé pour l'indentation, on peut pas faire mieux dans les commentaires...

Et avec un iterateur, on pourrait faire ça en une seule ligne... Arf.;)
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
12 -
Avec un itérateur de la SPL :

function caesar($string, $offset, $mode) {
foreach ($it = new ArrayIterator(str_split($string)) as $char) {
$string[$it->key()] = chr(ord($string[$it->key()])+$offset*pow(-1, intval((bool) $mode)+1));
}
}

On pourrait faire encore un peu plus propre avec la classe StringIterator que j'avais publiée il y a quelques temps.
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
12 -
Oups, au temps pour moi... même si ça fonctionne, autant utiliser la variable $char :

function caesar($string, $offset, $mode) {
foreach ($it = new ArrayIterator(str_split($string)) as $char) {
$string[$it->key()] = chr(ord($char)+$offset*pow(-1, intval((bool) $mode)+1));
}
}
cs_Nementon
Messages postés
21
Date d'inscription
dimanche 27 janvier 2008
Statut
Membre
Dernière intervention
25 mai 2010
-
Héhé, oui tout à fait, j'ai hésité à le faire sur deux lignes, mais, comme c'est dans la vision de le partager aux débutants tout débutants, je me suis dis qu'il ne valait mieux ne pas faire trop tordu ; )

Pour l'algo de césar, effectivement, je ne n'avais pas pensé sur que coups, que la deuxièmes fonction, se transformée tellement qu'elle n'était plus de César (Je ne suis pas du matin, faut croire ;)

Intéressant le code de la SPL, tes remarques aussi, étant donné que je débute en crypto.

Par contre, ce que je vais rajouter, c'est une petite condition pour eviter de depasser le 250em caractères de la table ACSII (Si mes souvenir sont bons).
Au début je m'étais dis, que c'était futile, m'enfin bon, ma source est incomplète sans ca, donc si quelqu'un repasse par ici, source modifier. (J'en profite pour enlever la deuxièmes fonction)
cs_Nementon
Messages postés
21
Date d'inscription
dimanche 27 janvier 2008
Statut
Membre
Dernière intervention
25 mai 2010
-
Édit : j'ai rien dis, php est un bon, il gère ca lui même comme un grand, je laisse ma fonction hybride du coups, tiens je le nomme même algorithme du champi pour l'occase, hop ;)

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.