Décryptage du chiffre de César sans connaître la clé à l'avance [Résolu]

dimass01 4 Messages postés mercredi 25 avril 2007Date d'inscription 13 novembre 2012 Dernière intervention - 10 nov. 2012 à 14:35 - Dernière réponse :  nicotontige
- 13 nov. 2012 à 09:09
Bonjour à tous,

Je cherche des explications très simplistes pour coder un programme en PHP, qui permet de décrypter le chiffre de césar sans connaître à l'avance la clé.
Merci à l'avance pour vos messages postés
Afficher la suite 

6 réponses

Répondre au sujet
nicotontige - 12 nov. 2012 à 12:10
+1
Utile
arf, par chiffre de césar je suis resté sur chiffre romain ....
Idiot que je suis, donc ma réponse ne te sers à rien du tout
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nicotontige
nicotontige - 12 nov. 2012 à 15:00
0
Utile
pour revenir à l'explication, sans clé, tu es obligé d'afficher tous les résultats...
Comme c'est basé sur l'alphabet, tu auras donc 25 possibilités (26 - 1 qui correspond à la phrase donnée) :

<?php
$chaine = "abc zyx";

$liste="abcdefghijklmnopqrstuvwxyz";
for ($k = 0 ; $k < 25 ; $k++) { // boucle des 25 possibilités
for( $i = 0 ; $i < strlen($chaine) ; $i++ ) { // tant qu'il y a des caractères dans la chaine
if(strpos($liste, $chaine[$i]) !== false) {
$j = strpos($liste,substr($chaine,$i,1)); // on recherche la position de la lettre dans la liste

$j += 1; // on rajoute le décalage
while($j+1 > strlen($liste)) { //si on sort de la liste (+26)
$j -= strlen($liste);
}
$chaine[$i] = $liste[$j]; // création de la nouvelle chaine
}
}
echo $chaine.'
'; // affichage du résultat
}
?>



résultat :
bcd azy
cde baz
def cba
efg dcb
fgh edc
ghi fed
hij gfe
ijk hgf
jkl ihg
klm jih
lmn kji
mno lkj
nop mlk
opq nml
pqr onm
qrs pon
rst qpo
stu rqp
tuv srq
uvw tsr
vwx uts
wxy vut
xyz wvu
yza xwv
zab yxw
Commenter la réponse de nicotontige
dimass01 4 Messages postés mercredi 25 avril 2007Date d'inscription 13 novembre 2012 Dernière intervention - 13 nov. 2012 à 00:30
0
Utile
Merci nicotontige,

Ta réponse me fera avancée, mais ne répond pas entièrement à ma question. Le but que je cherche c'est de décrypter en retrouvant uniquement la phrase qui a été crypté au début, donc pour cela il me faut un décalage dynamique.

Je m'explique :

J'ai mis ton code dans une fonction qui doit retournée la chaine décryptée :

<?php

echo'
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

<form action="" method="post">
Chaine :,
<textarea name="chaine" col="7" row="5">il y a quelque chose de pourri au royaume de danemark</textarea>,

,
----


</form>
';

if (isset($_POST['envoyer']) && isset($_POST['chaine'])) {

$chaine = $_POST['chaine'];

function decyptCesar($chaine) {

$liste = "abcdefghijklmnopqrstuvwxyz";
for ($k = 0; $k < 25; $k++) { // boucle des 25 possibilités
for ($i = 0; $i < strlen($chaine); $i++) { // tant qu'il y a des caractères dans la chaine
if (strpos($liste, $chaine[$i]) !== false) {
$j = strpos($liste, substr($chaine, $i, 1)); // on recherche la position de la lettre dans la liste

$j += 1; // on rajoute le décalage

while ($j + 1 > strlen($liste)) { //si on sort de la liste (+26)
$j -= strlen($liste);
}
$chaine[$i] = $liste[$j]; // création de la nouvelle chaine
}
}
//echo $chaine.'
'; // affichage du résultat
}
return $chaine;
}
// affichage du résultat
echo decyptCesar($chaine);
}
?>

Si par exemple ma chaine est :
$chaine = 'voici une phrase de teste avec un decalage de deux';

Après cryptage avec une clé = 2 j'obtiens la chaine suivante :
xqkek wpg rjtcug fg vguvg cxge wp fgecncig fg fgwz

Maintenant si j'essaye de décrypter cette dernière chaine avec ton code sans changer la valeur du décalage de 1 à 2, je ne retrouverai pas ma phrase de départ qui a été crypter, donc il faut que la valeur d'incrémentation du décalage soit variable et c'est de que j'avais pas pu coder avant de poster ma question.

En tout cas merci, je continue à réfléchir la dessus
Commenter la réponse de dimass01
nicotontige - 13 nov. 2012 à 09:05
0
Utile
Tu peux décoder ta phrase avec le dernier code que je t'ai mis.
Maintenant, si tu veux avoir une variable pour la clé, rien de plus simple, il suffit de retirer le nombre de la clé.
Si tu as 2 en clé pour crypter, tu fait -2 pour décrypter :
<?php
function decyptCesar($chaine, $cle) {
$chaine = strtolower($chaine); //afin que la liste soit en minuscule, et donc pas de problème pour trouver ton caractère dans la liste
$liste="abcdefghijklmnopqrstuvwxyz"; //liste des caractères
for( $i = 0 ; $i < strlen($chaine) ; $i++ ) { // tant qu'il y a des caractères dans la chaine
if(strpos($liste, $chaine[$i]) !== false) {
$j = strpos($liste,substr($chaine,$i,1)); // on recherche la position de la lettre dans la liste
$j -= $cle; // on enlève le décalage
while($j+1 > strlen($liste)) { //si on sort de la liste (+26)
$j -= strlen($liste);
}
$chaine[$i] = $liste[$j]; // création de la nouvelle chaine
}
}
return $chaine; // retour du résultat
}
?>
Commenter la réponse de nicotontige
nicotontige - 13 nov. 2012 à 09:09
0
Utile
En tout cas, saches que ce n'est pas possible de décoder une chaine codée sans connaitre la clé, car php ne pourra pas te dire si les mots sont existant ou ne veulent rien dire.
à moins bien sur de vérifier avec un dictionnaire tous les mots retrouvés, mais cela implique aussi que les mots sont correctement écrits.
Commenter la réponse de nicotontige
nicotontige - 12 nov. 2012 à 12:08
-2
Utile
Bonjour,

Il suffit de faire un switch selon le caractère rencontré dans la chaine envoyé. Dans le switch, ajouter la valeur correspondante (100, 500, ...).
Et prendre en considération bien sur du "IX" et "IV".

Code :

<?php
function conversion($chaine) {
$chaine = strtoupper($chaine); //on met la chaine en majuscule pour ne pas créer d'erreur par la suite
$result = 0; //on initialise la variable à retourner
for ($i=0;$i<strlen($chaine);$i++) { //pour tous les caractères dans la chaine
switch ($chaine[$i]) { //selon le caractère
case "M":
$result +=1000;
break;
case "D":
$result +=500;
break;
case "C":
$result +=100;
break;
case "L":
$result +=50;
break;
case "X":
$result +=10;
break;
case "V":
$result +=5;
break;
case "I":
if ($i !strlen($chaine)-1) { //si on n'est pas le dernier caractère> pour ne pas faire d'erreur avec $chaine[$i=1]
if ($chaine[$i+1] == "X") { //si le prochain caractère est X on fait +9
$result +=9;
$i++;
break;
} else if ($chaine[$i+1] == "V") { //si le prochain caractère est X on fait +4
$result +=4;
$i++;
break;
} else { //sinon +1
$result +=1;
break;
}
} else { //si dernier caractère, alors +1
$result +=1;
break;
}
}
}
return $result; //on retourne le résultat
}
?>/color
Commenter la réponse de nicotontige

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.