begin process at 2010 02 10 14:20:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > CRYPTAGE / DECRYPTAGE BASIQUE EN PHP UTILISANT LE PRINCIPE DU CARRE DE VIGENÈRE

CRYPTAGE / DECRYPTAGE BASIQUE EN PHP UTILISANT LE PRINCIPE DU CARRE DE VIGENÈRE


 Information sur la source

Note :
Aucune note
Catégorie :Sécurité & Cryptage Classé sous :vigenère, cryptage, php, codage, cryptographie Niveau :Débutant Date de création :17/10/2006 Date de mise à jour :12/02/2007 23:52:37 Vu :20 248

Auteur : Tadpole

Ecrire un message privé
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Bon, c'est hyper basique comme cryptage.

J'avais pondu ca lors de mes cours de philo, en 98, au debut c'etait en Pascal. Je l'ai converti en Php l'an passe pour m'amuser un peu. (c'est fou ce qu'on s'ennuie en Oklahoma...!)

Le principe est simple: on dispose d'un texte que l'on veut crypter. On y ajoute une clef. Le principe est d'ajouter la valeur ascii de la premiere lettre du texte original a la valuer ascii de la premiere lettre de la clef, et ainsi de suite jusqu'a la fin du texte.

Pour le decodage, on fait l'oppose.

Le code est a ameliorer...

Source

  • =--= Fonction "Crypter" =--=
  • //Début de ma fonction crypter
  • //Entrée: message à crypter, mot de passe. (les deux sont de type chaine)
  • //Je considère les chaines comme étant des tableaux de caractères
  • //Sortie: message encrypté. (chaine)
  • //Ecrit par Tadpole, Décembre 1998, cours de Philo.
  • //Traduit du Pascal/Delphi
  • function crypter($mes,$password) {
  • $res=' ';
  • $j=0;
  • $tmp=0;
  • //initialisations des variables.
  • //J'ai pour habitude de toujours déclarer les types de mes variables...
  • $lgmot = strlen($mes);
  • //on récup la longueur du message
  • //puis on boucle en analysant chaque caractère tour à tour jusqu'au bout du message.
  • for ($i = 0; $i < $lgmot; $i++) {
  • $tmp = ord($mes[$i]) + ord($password[$j]);
  • //La ligne précédente est le coeur du programme:
  • //on ajoute la valeur ascii du caractère en position i
  • //à la valeur ascii du caractère en position j. Simple mais efficace.
  • //si le resultat est supérieur a 255, pas de panique, on enlève 256 et on retombe sur nos pieds ;-)
  • if ($tmp > 255) {
  • $tmp = $tmp - 256;
  • }
  • $res[$i]=chr($tmp);
  • if ($j == (strlen($password)-1)) {
  • $j= 0;
  • } else {
  • $j=(($j % (strlen($password))) + 1);
  • //Ahh... le modulo... J'adore :-)
  • }
  • }
  • $res = base64_encode($res);
  • //base64 est conseille pour le traitement des chaines longues, cf. 'Programming PHP', Ed. O'Reilly, Rasmus Lerdorf & Kevin Tatroe, page 385.
  • return $res;
  • //On retourne le messsage crypté.
  • }
  • =--= Fonction "Décrypter" =--=
  • //Début de ma fonction décrypter
  • //Entrée: message à décrypter, mot de passe. (les deux sont de type chaine)
  • //Je considère les chaines comme étant des tableaux de caractères
  • //Sortie: message décrypté. (chaine)
  • //Ecrit par Tadpole, Décembre 1998, cours de Philo.
  • //Traduit du Pascal/Delphi
  • function decrypter($mes,$password) {
  • $res=' ';
  • $j=0;
  • $tmp=0;
  • //Initialisation des variables
  • $mes = base64_decode($mes);
  • //on decode le message encode en base64.
  • //Ensuite, on récup la longueur du message
  • //Puis on boucle tant que nous n'avons pas parcouru
  • //chaque lettre contenue dans le message.
  • $lgmot = strlen($mes);
  • for ($i = 0; $i < $lgmot; $i++) {
  • $tmp = ord($mes[$i]) - ord($password[$j]);
  • //ici on prends les 2 valeurs ascii des caratères du message
  • //en position i et du mot de passe en position j et on les soustrait.
  • //Si le résultat est négatif, pas de panique, on ajoute 256 et hop,
  • //nous nous y retrouvons.
  • if ($tmp < 0) {
  • $tmp = 256 + $tmp;
  • }
  • $res[$i]=chr($tmp);
  • if ($j == (strlen($password)-1)) {
  • $j= 0;
  • } else {
  • $j=(($j % (strlen($password))) + 1);
  • //Modulo pour parcourrir le mot de passe...
  • }
  • }
  • return $res;
  • }
=--= Fonction "Crypter" =--=

//Début de ma fonction crypter 
//Entrée: message à crypter, mot de passe. (les deux sont de type chaine) 
//Je considère les chaines comme étant des tableaux de caractères 
//Sortie: message encrypté. (chaine) 
//Ecrit par Tadpole, Décembre 1998, cours de Philo. 
//Traduit du Pascal/Delphi
   function crypter($mes,$password) {
	 $res=' ';
	 $j=0;
	 $tmp=0;
//initialisations des variables. 
//J'ai pour habitude de toujours déclarer les types de mes variables...
	 $lgmot = strlen($mes);
//on récup la longueur du message 
//puis on boucle en analysant chaque caractère tour à tour jusqu'au bout du message.
	for ($i = 0; $i < $lgmot; $i++) {
		$tmp = ord($mes[$i]) + ord($password[$j]);
//La ligne précédente est le coeur du programme: 
//on ajoute la valeur ascii du caractère en position i 
//à la valeur ascii du caractère en position j. Simple mais efficace. 
//si le resultat est supérieur a 255, pas de panique, on enlève 256 et on retombe sur nos pieds ;-)
	if ($tmp > 255) {
			$tmp = $tmp - 256;
			}
		$res[$i]=chr($tmp);
	if ($j == (strlen($password)-1)) {
			$j= 0;
			}	else {
			$j=(($j % (strlen($password))) + 1);
//Ahh... le modulo... J'adore :-)
			}
		}
        $res = base64_encode($res);
//base64 est conseille pour le traitement des chaines longues, cf. 'Programming PHP', Ed. O'Reilly, Rasmus Lerdorf & Kevin Tatroe, page 385.
	return $res;
//On retourne le messsage crypté.
	}

=--= Fonction "Décrypter" =--=

//Début de ma fonction décrypter 
//Entrée: message à décrypter, mot de passe. (les deux sont de type chaine) 
//Je considère les chaines comme étant des tableaux de caractères 
//Sortie: message décrypté. (chaine) 
//Ecrit par Tadpole, Décembre 1998, cours de Philo. 
//Traduit du Pascal/Delphi
   function decrypter($mes,$password) {
	 $res=' ';
	 $j=0;
	 $tmp=0;
//Initialisation des variables 
         $mes = base64_decode($mes);
//on decode le message encode en base64.
//Ensuite, on récup la longueur du message 
//Puis on boucle tant que nous n'avons pas parcouru 
//chaque lettre contenue dans le message.
	 $lgmot = strlen($mes);
	for ($i = 0; $i < $lgmot; $i++) {
		$tmp = ord($mes[$i]) - ord($password[$j]);
//ici on prends les 2 valeurs ascii des caratères du message 
//en position i et du mot de passe en position j et on les soustrait. 
//Si le résultat est négatif, pas de panique, on ajoute 256 et hop, 
//nous nous y retrouvons.
	if ($tmp < 0) {
			$tmp = 256 + $tmp;
			}
			$res[$i]=chr($tmp);
		
	if ($j == (strlen($password)-1)) {
			$j= 0;
			}	else {
			$j=(($j % (strlen($password))) + 1);
//Modulo pour parcourrir le mot de passe...
			}
		}
	return $res;
	}


 Conclusion

Voila, j'attends vos critiques, car je sais que ce source est loin d'etre parfait :)


 Historique

17 octobre 2006 09:24:33 :
Caché mon nom :)
17 octobre 2006 09:27:16 :
Ajout de commentaires
18 octobre 2006 08:37:27 :
Mise a jour: J'ai tenu compte des critiques. Je vous propose cette version sans les declarations de variables. Encore merci pour les commentaires :)
03 novembre 2006 00:49:11 :
efface le ltrim($res);
14 décembre 2006 09:39:17 :
corrections mineures
12 février 2007 23:52:37 :
Mise en plac du codage/decodage en base64. Modifications mineures. Teste et approuve :)

 Sources de la même categorie

ALGORITHME DE CÉSAR SUR LA TABLE ASCII par Nementon
Source avec une capture CODEC D'OBFUSCATION DE LIEN HTML (PHP5) par masternico
GÉRER UN .HTPASSWD par coockiesch
Source avec Zip SERSESSIONS > CLASS PHP5 POUR GERER LES SESSIONS SIMPLEMENT par Astalavista
Source avec Zip PROTECTION CONTRE LES FAILLES CSRF : CROSS SITE REQUEST FORG... par aKheNathOn

 Sources en rapport avec celle ci

Source avec une capture PAGINATION EN PHP par Orangina
Source avec Zip SCREENMAIL-SOLUTION DE CONTACT POUR WEBMASTERS par bnrj
Source avec Zip GESTION_ENSEIGNANTS par Elmarzougui
CHIFFRE DE VIGENÈRE par franco_se
CRACKAGE CHAINES CRYPTER EN MD5 PAR BRUTEFORCE par Astalavista

Commentaires et avis

Commentaire de malalam le 17/10/2006 10:20:05 administrateur CS

Hello,

je ne vais pas critiquer la qualité du cryptage, pas assez de temps.
Mais je m'attaque à quelques broutilles php ;-)
(string) $res=' ';
Inutile. $res = ' '; implique déjà que $res soit de type string.

(string) $lgmot = strlen($mes);
Why ?? strlen renvoie un entier, et tu utilises $lgmot en tant qu'entier. Pourquoi le forcer en tant que chaîne...??

(string) $res = trim($res);
Idem, trim () renvoie une chaîne de toute façon.

return (string) $res;
T'abuses, lol. Tu types une variable que tu as typée la ligne précédente, et qui était de toutes façons typée par une fonction...trop de typage tue le typage!

Commentaire de kankrelune le 17/10/2006 12:20:13

Ca sent les vieilles habitude du codeur de C... lol... .. . ;o)

Mais en php ça marche différament la façon dont tu déclare ta variable conditionne sont typage... tu ne doit utiliser la convertion de type que si tu veux changer de type ou que si tu n'est pas sur du type obtenu... .. .

Qui plus est ça te pousse à faire des erreurs... .. .

(string) $lgmot = strlen($mes);
for ($i = 0; $i < $lgmot; $i++) {

Tu compare si une chaine ($lgmot) est plus grand qu'un entier ($i)... .. . :oS

Pour le reste le principe est là... tout comme Malalam je ne m'étendrais pas sur la relative protection qu'offre l'algo de Vingenere... c'est bien pour s'échanger des mots doux en secret... pas plus... cependant étudier le principe de chiffrement de cet algo reste instructif... .. .

@ tchaOo°

Commentaire de Tadpole le 18/10/2006 07:46:42

Merci pour vos commentaires. en effet, declarer le type est une veille habitude. Je ne le fais pas pour php, mais puisque c'est ma premiere source a publier, j'ai pense que, bien que cela n'est pas necessaire, ca peut tout de meme faciliter la lecture et la comprehension pour certaisn debutants. (Ceci dit, ca peut aussi ajouter de la confusion...)

Quoiqu'il en soit, merci bcp pour vos commentaires!

Commentaire de Tadpole le 20/10/2006 06:36:21

Par contre petite question, j'ai remarque que en fonction de l'encodage des caracteres dans firefox, j'obtenais des resultats extremement differents. Aussi, il y a des problemes au niveau des caracteres accentues...

Ce source ne demande qu'a etre ameliore :)

Commentaire de kankrelune le 20/10/2006 13:17:09

Le résultat tel quel que te retourne la fonction n'est pas fait pour être affiché... tu risque d'avoir des pertes si tu fais un copié collé... pour l'affichage mieux vaut encoder la chaine par exemple via base64_encode() ou en hexadécimal... .. .

Aussi plutot que de faire plusieurs strlen($password) dans ta boucle crée une variable

$lenpassword = strlen($password);

Ca t'évitera de faire plein d'appel à strlen()... .. . ;o)

@ tchaOo°

Commentaire de Tadpole le 23/10/2006 08:51:43

ok merci bien :)

Commentaire de J_G le 23/10/2006 11:58:54

Bonjour...

Ca fait longtemps que je n'ai pas posté sur PHPCS. Ca tombe sur toi!

Tout d'abord, félicitation !!! Tu as réinventé le système de cryptage "Enigma", largement utilisé par les Nazis durant la guerre... Ils utilisaient (bien sur) une version plus complexe de ta version (cf. http://fr.wikipedia.org/wiki/Enigma_%28machine%29).

Mais en regardant la page Wikipédia de plus pres (http://fr.wikipedia.org/wiki/Enigma_%28machine%29#Anecdote)... C'était donc toi l'espion qui a pourri Unix avec cette commande de cryptage... !!! Note: j'espère que cela t'a permis de décrypter la philo. Moi, j'ai jamais réussi.

Sinon, coté PHP:
* Complétement d'accord avec les remarques précédantes (sur-typage, base64, ...)
* J'aurais fait ta boucle de cryptage ainsi :

<?php
function crypter($mes,$password) {
  $res='';
  $i = 0;
  $j = 0;
  $lgMot = strlen($mes);
  $lgPass = strlen($password);

  while ( $i < $lgMot ) $res.= chr( (ord($mes[$i++]) + ord($password[$j++%$lgPass]))%256 );
  //Ahh... le modulo... J'adore :-)
  //JG=> Moi aussi... ch'uis fan!

  return base64_encode(trim($res));
}
?>

J'aime bien écrire une ligne de code qui en valaut 10... Normalement, je mets des commentaires avec ce genre de ligne. Mais la, puisqu'on parle de cryptage! ;]

A+

Note : J'ai pas testé mon code...

Commentaire de J_G le 23/10/2006 12:45:42

Encore moi... J'ai eu un flash durant une extremement ennuyeuse reunion d'équipe :

l'appelle de trim() juste avant de retourner le message crypté est une grave erreur, car trim() occasionne une perte de donnée irréversible.

Par exemple, si tu cryptes un numero de compte banquaire. Et par malchance, le dernier numéro glisse sur un espace ou un retour charriot, ou... Tu le pers !!

Commentaire de kankrelune le 23/10/2006 15:42:35

Ouep jamais de trim sur la chaine crypté... par contre sur la chaine décrypté il faut généralement le faire notament sur les algo de block (à cause du padding appliqué aux blocks)... .. .

@ tchaOo°

Commentaire de Tadpole le 24/10/2006 02:46:50

ok merci bien a vous deux, j'apprecie grandement vos commentaires!!!

Commentaire de zimilev le 03/01/2007 23:26:22

Merci pour ces deux petites fonctions bien pratiques !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Cryptage !!??!! [ par vincenteraptor ] UGH!Comment va les PHPCSusers???J ai un pb : j aimerai savoir deux petites choses à propos de cryptage :- Existe t il des fonction de cryptage réversi Sécurité & Cryptage des sources [ par GregPeck ] Bonjour,Je viens de créer à ma boite un logiciel de gestion de planning en php mysql sur un serveur linux. Les gens peuvent créer leur planning sur no Se servir des fonctions php cryptage [ par SaFt ] bonjour voila j'essaye désesperement de faire fonctionner les fonctions php du genre base64_encode/decode; encrypt/decrypt et d'autre. je ne comprend codage UFT-8 au lieu de ISO [ par fyav ] avant, tous mes fichiers php qui envoyaient un formulaire fonctionnaient très biendepuis 3 jours, sans changer la programmation, IE considère mes page htpasswd [ par neolien ] Bonjour &#224; tous, Je suis d&#233;butant en php et j'essaie de placer une s&#233;curisation sur des r&#233;pettoires avec htacess et htpasswd. Pour cryptage mot de passe [ par eax ] salut!j'ai vu sous phpmyadmin qu'on pouvait crypter des champs varchar lorsqu'ils contiennent des mots de passe par exemple, mais on fait comment en p Cryptage AES ... [ par LocalStone ] Bonsoir &#224; tous, Je cherche d&#233;sesperement un script PHP qui permeterait de crypter n'importe quel texte avec un codage AES (ou autre, mais un Cryptage des sources PHP [ par Will28 ] Bonjour,&nbsp;je voulais savoir si quelqu'un pouvait me renseigner sur le cryptage des sources PHP, et plus sp&#233;cialement sur les produit Zend.En *PHP* Cryptage adresse mail ! [ par masterfree ] Bonjour &#224; tous,Avant, j'avais un site en Html; maintenant, je fais le m&#234;me en PHP.Je crypte mes mails en JS (Html). J'ai vu plusieurs exempl fonction de cryptage compatible PHP et javascript [ par pastis51forever ] Bonjour!Je suis à la recherche d'une fonction de cryptage qui existerait en php et en javascript (En fait une fonction php et une javascript compatibl


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales