Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CHIFFRE DE CESAR


Information sur la source

Catégorie :Sécurité & Cryptage Classé sous : cesar, algorithme, chiffrement, chiffre, césar Niveau : Débutant Date de création : 06/03/2007 Date de mise à jour : 06/03/2007 08:23:00 Vu : 7 229

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Hello all !
Comme j'ai eu besoin recement d'une implementation du chiffre de Cesar en php et que les codes que j'ai trouves sur phpcs etaient des uzines a gaz (desole pour les auteurs, ce n'est pas contre vous), j'ai ecris cette petite fonction qui fait tout comme une grande ;-)
Rien de palpitant ni de tres complique, je mets le source ici juste au cas ou quelqu'un soit un jour dans la meme situation que moi et cherche un truc pas complique et fonctionnel :p
 

Source

  • <?php
  • #########################################################
  • # CHIFFRE DE CESAR #
  • # #
  • # $Msg : texte a crypter/decrypter #
  • # $Clef : offset a applique #
  • # $Action : TRUE = crypter; FALSE = decrypter #
  • #########################################################
  • function Cesar($Msg, $Clef, $Action)
  • {
  • $Charset = 'abcdefghijklmnopqrstuvwxyz';
  • $CharsetLen = strlen($Charset);
  • $MsgLen = strlen($Msg);
  • // Au cas ou la clef ne serait pas valide (qu'elle depasse la longueur du charset ou qu'elle soit inferieur a 0 - ce qui n'est pas super utile :p)
  • if ( ($Clef > $CharsetLen) || ($Clef < 0) )
  • return FALSE;
  • // Boucle de traitement
  • for ( $i=0; $i<$MsgLen; $i++ )
  • {
  • // Evalue la position de la lettre dans le charset
  • if ( ($Pos = strpos($Charset, $Msg[$i])) !== FALSE )
  • {
  • if ( $Action )
  • {
  • if ( ($Result = $Pos + $Clef) > $CharsetLen )
  • $Result = $Result - $CharsetLen;
  • }
  • else
  • {
  • if ( ($Result = $Pos - $Clef) < 0 )
  • $Result = $CharsetLen - ($Result * (-1));
  • }
  • $Msg[$i] = $Charset[$Result];
  • }
  • }
  • return $Msg;
  • }
  • ?>
<?php
#########################################################
#				CHIFFRE DE CESAR						#
#														#
#		$Msg : texte a crypter/decrypter				#
#		$Clef : offset a applique						#
#		$Action : TRUE = crypter; FALSE = decrypter		#
#########################################################
function Cesar($Msg, $Clef, $Action)
{
	$Charset = 'abcdefghijklmnopqrstuvwxyz';
	$CharsetLen = strlen($Charset);

	$MsgLen = strlen($Msg);
		
	// Au cas ou la clef ne serait pas valide (qu'elle depasse la longueur du charset ou qu'elle soit inferieur a 0 - ce qui n'est pas super utile :p)
	if ( ($Clef > $CharsetLen) || ($Clef < 0) )
		return FALSE;
		
	// Boucle de traitement
	for ( $i=0; $i<$MsgLen; $i++ )
	{
		// Evalue la position de la lettre dans le charset
		if ( ($Pos = strpos($Charset, $Msg[$i])) !== FALSE )
		{
			if ( $Action )
			{
				if ( ($Result = $Pos + $Clef) > $CharsetLen )
					$Result = $Result - $CharsetLen;
			}	
			else
			{
				if ( ($Result = $Pos - $Clef) < 0 )
					$Result = $CharsetLen - ($Result * (-1)); 
			}		
			$Msg[$i] = $Charset[$Result];
		}			
	}
	return $Msg;
}
?>

Conclusion

Exemple en pratique :
<?php
$String = 'salut';
echo Cesar($String, 12, TRUE);
?>

Effectuera une substitution de 12 lettres sur le mot 'salut'. Attention par contre aux caracteres non pris en compte dans le charset(espace, caracateres accentues, ect ...) ! Pensez a modifier celui-ci si jamais vous desirez ne pas trie vos entrees.

Au niveau du code, j'ai fait de mon mieux mais je le repetete, rien de palpitant en somme. En ce qui concerne la securite, il est evident que ce type de securite (si on peut appeller sa comme sa tellement c'est faible) est a proscrire imperativement, c'est juste pour l'exemple. N'allait pas me dire que AES, DES RSA & companie sont mieux, je le sais bien ;-)

@++ et bon coding ^^
 

Historique

06 mars 2007 07:53:19 :
J'ai oublie de mettre les balises <?php [...] ?>, y avait pas de coloration :p
06 mars 2007 08:23:00 :
Quelques petites fautes d'orthographes ...(vraiment visible ^^) ... pourtant j'avais "jete un dernier coup d'oeil" ;-)

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 06/03/2007 22:18:47 administrateur CS

Hello :-)
Aucune idée de ce qu'est le chiffre de César, mais c'est correctement codé :-)
2 chose simplement : tu devrais prendre l'habitude de typer tes variables. Enfin, "tu devrais"...non, c'est toi qui vois :-) Mais perso, j'aime bien voir par exemple : $sMsg, parce que je sais de suite que c'est une variable de type string, ou $iPos, parce que je sais de suite que c'est une variable de type int.
Mais c'est juste une habitude...
Le 2d truc : je suis nul en math ... mais vraiment nul hein. Mais $Result * (-1), c'est pas équivalent à -$Result ?

Sinon c'est bien, pas pompeux, clair, concis...bien :-)

signaler à un administrateur
Commentaire de jean84 le 07/03/2007 01:06:56

Hello

Merci pour ton commentaire ;-)
Le chiffre de Cesar, c'est un algo de substitution de lettre dans une phrase. Le mieux est que tu regardes ce site : http://www.apprendre-en-ligne.net/crypto/cesar/index.html, il t'expliquera surement mieux que moi.

Je multiplie $Result par -1 pour le rendre positif car il est forcement negatif dans le bout de code que tu indiques. Cela viendrait effectivement a faire un --$Result donc un +$Result mais par habitude, mieux vaut multiplier par -1.

"Le 2d truc : je suis nul en math ... mais vraiment nul hein"
Je parie que je suis encore plus nul que toi, et c'est pas une blague :-( lol

Pour le typage des var, c'est vrai que c'est mieux. Je le fait pourtant quand je fais du C/C++ mais en php, j'ai pas encore l'habitude. J'avais deja remarque sur tes codes que tu le faisais, mais j'arrive pas a l'integrer dans mes codes (surtout quand je travail avec DOM et XPATH... je vois pas ce que je pourrais mettre pour indiquer le type). Il me manque une declaration avant (j'ai commence par le C donc il me faut un int, char ou n'importe quoi d'autres). Je sais que c'est idiot mais je vais quand meme essayer de faire un efort a l'avanenir.

@++

signaler à un administrateur
Commentaire de coucou747 le 07/03/2007 08:34:09

mais ca sert a quoi de coder ca ? (on en voit partout : ici, sur javascriptfr ect...) alors que ca se casse en meme pas une demie seconde... j'ai code un truc en cpp pour le casser...

signaler à un administrateur
Commentaire de FhX le 07/03/2007 16:52:56

#  if ( $Action )
# {
# if ( ($Result = $Pos + $Clef) > $CharsetLen )
# $Result = $Result - $CharsetLen;
# }
# else
# {
# if ( ($Result = $Pos - $Clef) < 0 )
# $Result = $CharsetLen - ($Result * (-1));
# }

$Result = ( $Action && ( ($Pos + $Clef) > $CharsetLen ) ) ?
            ($Pos + $Clef) - $CharsetLen :
          ( !$Action && ( ($Pos - $Clef) < 0 ) ) ?
            $CharsetLen - ( -($Pos - $Clef) ) :
            NULL;

Qu'est ce que je peux arriver à faire des trucs aussi moche des fois :D

signaler à un administrateur
Commentaire de FhX le 07/03/2007 16:54:23

Ah si, fallait bien que je sorte un truc spécial optimisation de ouf qui change pas grand chose :D

$MsgLen = strlen($Msg);

==> à mettre dans la déclarative du for() :p


J'ai pas pu m'en empécher :(

signaler à un administrateur
Commentaire de jean84 le 07/03/2007 18:56:45

"mais ca sert a quoi de coder ca ?"
-> culture personnelle (faut bien commencer quelque part)
-> j'ai dit que j'en avais eu besoin et que j'avais rien trouver de palpitant sur phpcs alors je postais sa ou cas ou quelqu'un soit dans la meem situation que moi (et il me fallait en php, pas en js)
-> sur le lien que j'ai donne, l'auteur s'amuse meme a casser une phrase complete en javascript alors en C... autant utiliser une pelleteuse pour manger a la cuilliere ^^

"[...]alors que ca se casse en meme pas une demie seconde[...]"

Relis mon message :

"{...]il est evident que ce type de securite (si on peut appeller sa comme sa tellement c'est faible) est a proscrire imperativement, c'est juste pour l'exemple. N'allait pas me dire que AES, DES RSA & companie sont mieux, je le sais bien ;-)[...]"

C'est pourtant ecris noir sur blanc : je sais que c'est facile a casser d'autant que j'ai lourdement insiste dessus donc je vois pas trop l'interet de ton post (sans vouloir etre agressif ni sur la defensive bien entendu)

"Qu'est ce que je peux arriver à faire des trucs aussi moche des fois :D"
J'avoue ^^ Mais sa reste stylee quand meme ;-) Tu m'impressioneras toujours autant FhX ^^

"$MsgLen = strlen($Msg);
==> à mettre dans la déclarative du for() :p"

Comment sa ? Faire un for( $i; $i<strlen($Msg); $i++ ) ? Si je ne me trompe pas, sa fait qu'a chaque tour de boucle, je revalue la longueur de la chaine ? Pas top niveau performance... ou alors je comprend mal ce que tu as voulue me dire ?

@++

signaler à un administrateur
Commentaire de FhX le 07/03/2007 19:23:28

non, faire un :
for ($i=0, $len=strlen($Msg); $i<$len; $i++) {
//
}

Simplement pour l'écriture :)

signaler à un administrateur
Commentaire de FhX le 07/03/2007 20:02:28

Y'a quand meme un truc qui me chiffone. Imaginons un processus de cryptage (ca marche aussi pour le décryptage) :

#  if ( $Action )
# {
# if ( ($Result = $Pos + $Clef) > $CharsetLen )
# $Result = $Result - $CharsetLen;
# }

Si $pos+$clef > $longeur_du_charset Alors $Result -= $longueur_du_charset.

Oui, mais si $pos+$clef < $longueur_du_charset... $Result est NULL.
(pardon, indéfini je devrais dire).
Hors après, y'a ca :
# $Msg[$i] = $Charset[$Result];

$Msg indicé de $i recoit la valeur de $Charset indicé de $Result... oui mais si $Result vaut NULL... y'a pas comme une erreur ? ;)

C'est pareil pour le décryptage.
Vala :)

signaler à un administrateur
Commentaire de jean84 le 07/03/2007 20:33:19

Arf mais oui, comment j'ai pas pu voir sa ?
J'ai fusionne plusieurs esquisses d'algo avant d'ecrire celui la, d'ou la presence de $Result... Je retravail sa dessuite !

Merci

signaler à un administrateur
Commentaire de jean84 le 09/03/2007 21:16:01

Hello

Apres quelques reflexions, je me suis apercu que mon code n'etait pas bugge, bien au contraire ...
Si tu regardes bien (FhX), $Result n'est jamais initalise a NULL car dans

if ( $Action )
{
    if ( ($Result = $Pos + $Clef) > $CharsetLen )
        $Result = $Result - $CharsetLen;
}

Le if ( ($Result = $Pos + $Clef) > $CharsetLen ) initialise $Result ET le compare a $CharsetLen. A aucun moment $Result a une valeur indefinie ... :p

@++

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Compter les chiffre d'une colonne dans MySQL [ par Neozix ] Bonjour,Voila je souhaiterais compter les valeurs que j'ai dans une colonne, c'est une colonne qui contient des nombres de cd. cd -----1367je souhait Float ??? [ par Mamienova ] Je voudrais intégrer dans ma base de donnée un nombre décimal. Le seul petit probléme et que je souhaiterai qu'il n'y ait qu'un seul chiffre apres la Arrondir un chiffre en php [ par iomega ] ARRONDIR UN CHIFFRE Bonjour à tous je voudrais savoir comment arrondirce chiffre "0.27777777777778 " en 0.28 c'est-à-dire 2 chiffres après le pointMer Convertion nom==>chiffre [ par goliath2002 ] Bonjour, Je voudrais construire un formulaire tout a fait special.Permettre a l'utilisateur d'entrer dans un formulaire un "nom" et de trouver un chif verifier qu'une valeur envoyée est bien un chiffre [ par toulchris ] Bonjour,Un petit probleme que je n'arrive pas à résoudre. J'ai un formulaire ou l'utilisateur doit entrer un chiffre entier (cela pourrait servir dans problem avec <form> [ par rems02 ] Bonjour,Je ne sais pas comment envoyer une variable à partir d'un &lt;form&gt;j'ai une page:&lt;form action="page.php"&gt;&lt;select name="donnee1"&gt Algorithme de tri ... [ par LocalStone ] Salut à tous ! Il y a peut-être 1 mois et demi, j'ai lu un article - ou plutôt un tutorial - sur comment mettre en place un algorithme de tri automati Formatage de chiffre [ par akela13th ] Akela13thBonjour à tous, Je suis à la recherche d'une fonction PHP qui me permettrait de coder un chiffre sur 2 positions. Exemple : '0' deviendrait ' affichage dynamique [ par piep14 ] Ma question est : je souhaite afficher dans un champ un chiffre (ex:0) puis de chaque coté de ce champs, un bouton + et un bouton - qui permet d'augme requete sql [ par Metrox ] 'lut all,petite question sqly a-t-il moyen d'ajouter directement une valeur qui serra additionnée à la précédente, pr ensuite venir la remplacer dans


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.