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

Résolu
dimass01 Messages postés 4 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 13 novembre 2012 - 10 nov. 2012 à 14:35
 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
A voir également:

6 réponses

nicotontige
12 nov. 2012 à 12:10
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
1
nicotontige
12 nov. 2012 à 12:08
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
0
nicotontige
12 nov. 2012 à 15:00
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
0
dimass01 Messages postés 4 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 13 novembre 2012
13 nov. 2012 à 00:30
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicotontige
13 nov. 2012 à 09:05
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
}
?>
0
nicotontige
13 nov. 2012 à 09:09
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.
0
Rejoignez-nous