CRYPTAGE / DECRYPTAGE BASIQUE EN PHP UTILISANT LE PRINCIPE DU CARRE DE VIGENÈRE
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 2010
-
17 oct. 2006 à 10:20
digitaldax
Messages postés11Date d'inscriptionvendredi 11 mars 2005StatutMembreDernière intervention25 mars 2010
-
25 mars 2010 à 17:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
digitaldax
Messages postés11Date d'inscriptionvendredi 11 mars 2005StatutMembreDernière intervention25 mars 2010 25 mars 2010 à 17:13
Ca date mais c'est toujours d'actualité !
Merci pour cette source, j'ai juste ajouté un urlencode($res) afin de passer le token crypté dans une url, et c'est parfait !
zimilev
Messages postés1Date d'inscriptionmercredi 3 janvier 2007StatutMembreDernière intervention 3 janvier 2007 3 janv. 2007 à 23:26
Merci pour ces deux petites fonctions bien pratiques !
cs_Tadpole
Messages postés4Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention24 octobre 2006 24 oct. 2006 à 02:46
ok merci bien a vous deux, j'apprecie grandement vos commentaires!!!
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 23 oct. 2006 à 15:42
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°
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 23 oct. 2006 à 12:45
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 !!
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 23 oct. 2006 à 11:58
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 :
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...
cs_Tadpole
Messages postés4Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention24 octobre 2006 23 oct. 2006 à 08:51
ok merci bien :)
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 20 oct. 2006 à 13:17
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°
cs_Tadpole
Messages postés4Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention24 octobre 2006 20 oct. 2006 à 06:36
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 :)
cs_Tadpole
Messages postés4Date d'inscriptionmercredi 3 mars 2004StatutMembreDernière intervention24 octobre 2006 18 oct. 2006 à 07:46
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!
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 17 oct. 2006 à 12:20
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... .. .
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°
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 17 oct. 2006 à 10:20
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!
25 mars 2010 à 17:13
Merci pour cette source, j'ai juste ajouté un urlencode($res) afin de passer le token crypté dans une url, et c'est parfait !
3 janv. 2007 à 23:26
24 oct. 2006 à 02:46
23 oct. 2006 à 15:42
@ tchaOo°
23 oct. 2006 à 12:45
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 !!
23 oct. 2006 à 11:58
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...
23 oct. 2006 à 08:51
20 oct. 2006 à 13:17
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°
20 oct. 2006 à 06:36
Ce source ne demande qu'a etre ameliore :)
18 oct. 2006 à 07:46
Quoiqu'il en soit, merci bcp pour vos commentaires!
17 oct. 2006 à 12:20
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°
17 oct. 2006 à 10:20
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!