Bonjour à tous, voila je doit faire un prog en Java du code de César. Problème, le décodage foire à un moment et je n'arrive pas a trouver la bonne formule mathématique pour résoudre mon problème.
Bien entendu je ne veux pas qu'on me donne la réponse comme ça, jusque que l'on me métte sur une piste parce que la franchement je suis au point mort!
Voici mon code Java:
class cd
{
private String message,msg2, msg3, msg4;
private char [][] carre;
private char [] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
private int longueurChaine;
private int clef;
private int cpt = 0;
int calcul = 0;
private double racine;
private double modulo;
public cd()
{
System.out.println("\n\n");
System.out.println(" Bienvenue dans le logiciel de cryptage/decryptage de donnees utilisent la methode de Cesar");
System.out.println(" Choisir dans le menue le cryptage, le decrypage de vos donnees ou la notice d'utilisation ");
System.out.println("(ATTENTION!! : prendre toujours connaissance de la notice d'utilisation avant chaque nouvelle utilisation de ce logiciel)");
System.out.println("\n\n");
}
public void cryptage()
{
do{
System.out.println("\nSaisir votre message a coder:");
message = Clavier.lire_String();
msg4 = message;
// on retir les espaces
message = message.replaceAll(" ","");
// on compte le nombre de caractére sens les éspaces
longueurChaine = message.length();
// on cherche la racine carre de la longueuer du message
racine = Math.sqrt(longueurChaine);
// on fait le modulo de ce résultat avec 1
modulo = racine % 1;
if(modulo == 0)
{
//carre de cesar
carre = new char [(int) racine][(int) racine];
for(int i = 0; i < racine; i++)
{
for(int j = 0; j < racine; j++)
{
carre[j][i] = message.charAt(cpt);
cpt++;
}
}
cpt = 0;
msg2="";
for(int i = 0; i < racine; i++)
{
for(int j = 0; j < racine; j++)
{
msg2 = msg2 + carre[i][j];
}
}
// methode de cesar
cpt = 0;
System.out.println("Choisir une clef d'encodage (nombre entier)");
clef = Clavier.lire_int();
System.out.print("\nPlease wait . . . \n\n");
msg3 ="";
int i = 0;
while(longueurChaine > cpt)
{
if(alphabet[i] == msg2.charAt(cpt))
{
calcul = (i + clef)% 26;
msg3 = msg3 + alphabet[calcul];
cpt++;
i = 0;
}
i++;
if(i >= 26)
{
i = 0;
}
}
System.out.println("----------------------------------------------------");
System.out.println(" Message d'origine: " + msg4);
System.out.println(" Message code: " + msg3);
System.out.println(" Clef d'encodage: " + clef);
System.out.println("----------------------------------------------------");
}
else
{
System.out.println("Desole ce message ne peut pas etre code\n");
}
}while(modulo != 0);
}
public void decryptage()
{
do{
System.out.println("\nSaisir votre message coder pour decodage:");
message = Clavier.lire_String();
msg4 = message;
// on compte le nombre de caractére sens les éspaces
longueurChaine = message.length();
// on cherche la racine carre de la longueuer du message
racine = Math.sqrt(longueurChaine);
// on fait le modulo de ce résultat avec 1
modulo = racine % 1;
if(modulo == 0)
{
//methode de cesar
System.out.println("Choisir une clef d'encodage (nombre entier)");
clef = Clavier.lire_int();
cpt = 0;
msg2 ="";
int i = 0;
while(longueurChaine > cpt)
{
if(alphabet[i] == message.charAt(cpt))
{
if(i - clef >= 0)
{
msg2 = msg2 + alphabet[Math.abs((i - clef) - 65)%26];
}
else
{
msg2 = msg2 + alphabet[(Math.abs(i - clef) + longueurChaine)%26];
}
cpt++;
}
i++;
if(i >= 26)
{
i = 0;
}
}
//carre de cesar
carre = new char [(int) racine][(int) racine];
cpt = 0;
for(i = 0; i < racine; i++)
{
for(int j = 0; j < racine; j++)
{
carre[i][j] = msg2.charAt(cpt);
cpt++;
}
}
cpt = 0;
msg3="";
for(i = 0; i < racine; i++)
{
for(int j = 0; j < racine; j++)
{
msg3 = msg3 + carre[j][i];
}
}
//System.out.println(msg2);
System.out.println("----------------------------------------------------");
System.out.println(" Message code: " + msg4);
System.out.println(" Message d'origine: " + msg3);
System.out.println(" Clef d'encodage: " + clef);
System.out.println("----------------------------------------------------");
}
else
{
System.out.println("Desole ce message ne peut pas etre code\n");
}
}while(modulo != 0);
}
public void notice()
{
System.out.println("");
}
}
Il est assez long donc je vous dit bonne chance et merci d'avance à tout ceux qui pourront me mettre sur la voie
Petit problème, on n'a pas ta classe Clavier, on ne peut pas compiler pour voir où se situe l'erreur, donc faut rentrer dans ton code non commenté, ce qui n'est pas évident et qui fait fuir beaucoup de personnes
[EDIT]J'ai raconté n'importe quoi, désolé.
Alors effectivement il peut y avoir des soucis au niveau des espaces ou des accents... A toi de dire si tu veux les gérer ou non.
Il est pas si simple que ca lol il ne suffit pas de faire -1 pour que ça marche et c'est ce qui me pose probléme pour le Clavier
voici ma classe clavier:
import java.io.*;
class Clavier
{
public static String lire_String()
{
String ligne_lue = null;
try
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
ligne_lue = br.readLine();
}
catch (IOException e) {System.err.println(e);}
return ligne_lue;
}
public static int lire_int()
{
return Integer.parseInt(lire_String());
}
public static double lire_double()
{
return Double.parseDouble(lire_String());
}
public static char lire_char()
{
return lire_String().charAt(0);
}
}
et enfin ma classe principale (main):
/*
fichier: executable.java
fichier liees: cd.java
date de début de création: 03 Mars 2009
développeur: Kevin Dupeyrat
but: Apprendre le langage java. Projet de Devoir maison de DAIGL
Il s'agit de créer un programme de cryptage/décryptage de données.
On utilise la methode de César et le carré de César
*/
public class Util
{
public static void main(String[] arg)
{
System.out.println(" __________________________________________________________");
System.out.println(" | |");
System.out.println(" | ___ _____ ____ _______ ____ |");
System.out.println(" | | | | \\ / | | | | |");
System.out.println(" | | |_____| \\ / |____| | |____ |");
System.out.println(" | |___ | \\ | | | |____ |");
System.out.println(" | |");
System.out.println(" | |");
System.out.println(" | / DAIGL PROJET 2 / |");
System.out.println(" | |");
System.out.println(" |__________________________________________________________|");
int menu;
cd fonction;
fonction = new cd();
do{
System.out.println("-----------------------menu-------------------------");
System.out.println(" 1. Cryptage");
System.out.println(" 2. Decryptage");
System.out.println(" 3. Notice d'utilisation");
System.out.println("----------------------------------------------------");
menu = Clavier.lire_int();
switch(menu)
{
case 1:
fonction.cryptage();
break;
case 2:
fonction.decryptage();
break;
case 3:
break;
default:
System.out.println("Erreur de saisie recommance");
}
}while(menu < 1 && menu > 3);
}
}
Oui j'ai rectifié, mais faire +1 ou +clef c'est pas franchement différent
Je ne peux toujours pas compiler t'as une classe cd quelque part.
[EDIT]
Oh mea culpa. Oui exact je suis parti beaucoup trop vite j'ignore pourquoi.
Y'a plusieurs méthodes pour déchiffrer le message. Alors bon je vais m'amuser à lire ton code pour trouver laquelle tu as utilisée (analyse fréquentielle peut-être ?)
la classe cd c'est la premiére que j'ai donner et non tu verra par toi même que faire le chemin inverse du crpytage ne décrypte pas ça serrai trop facil sinon (ma prof de dév est un peut sadic sur les bort :p)
un peu HS mail il y a une grosse faiblesse au niveau de la méthode lire_string();
L'IOException est gérée dedans et donc si le reader rencontre un soucis, ça va juste passer dans le catch et renvoyer null, donc risque de comportement indéterminé plus haut.
Il serait plus sur soit
-que la méthode throws IOException et que l'appelant aie à la traiter.
-que tu gères l'erreur dedans mais tu rebalances une unchecked exception qui sera traitée plus loin.
-que tu ajoutes une clause finally qui renvoie une String d'erreur.
De plus aucune vérification du contenu de lire String dans les méthodes de conversion en type numérique, c'est vraiment pas safe tout ça.
Malheureusement y'a beaucoup de choses qui empêchent la compréhension de ton code.
Comme l'a dit shakhal (je l'ai pas vu du premier coup d'œil), ton programme risque fort les comportements imprévisibles.
Je fais des études de maths, et je n'ai jamais vu une opération modulo avec des nombres réels. (cf modulo = racine % 1)
Ca donne plein de résultats bizarres (il ne veut pas encoder certaines chaînes). C'est peut-être ton choix ok mais comme tu utilises la même chose pour le décodage, impossible de dire ce que ça fait.
Et puis il est assez difficile de déchiffrer le message si ce dernier est trop petit.
Je ne comprends pas la logique de ton code désolé.
Si tu ne veux pas beaucoup le modifier, je te conseille de faire des System.out.println de toutes tes variables aux moments clefs, par exemple avant de les modifier ou avant d'effectuer un calcul sur celles-ci.
Bsr ton code, n'est pas bien commente et il est assez volumineux, g travaille actuellement sur la conception d'un simulateur de chiffrement simple en java et jai deja implemente le code de cesar(cryptage et decryptage); actuellement g suis un peu bloque sur l'implementation du Code Telemecanique en java, et comment realiser des bonnes interfaces graphiques. Si kelkun peu maider sa me ferait plaisir. Don si ta besoin k g t file mon code nhesite pas.
en faite j'ai juste besoin de la formule de décryptage parce que ça ne marche pas pour moi. Après je ne m'y connaît pas encore en cryptage mais je pence que c'est une voie que je vais suivre
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'as-tu jamais fait un de ces rêves qui ont l'air plus vrai que la réalité ? Si tu étais incapable de sortir d'un de ces rêves, comme ferais-tu la différence entre le monde réel et le monde des rêves ?
N'as-tu jamais fait un de ces rêves qui ont l'air plus vrai que la réalité ? Si tu étais incapable de sortir d'un de ces rêves, comme ferais-tu la différence entre le monde réel et le monde des rêves ?
N'as-tu jamais fait un de ces rêves qui ont l'air plus vrai que la réalité ? Si tu étais incapable de sortir d'un de ces rêves, comme ferais-tu la différence entre le monde réel et le monde des rêves ?
N'as-tu jamais fait un de ces rêves qui ont l'air plus vrai que la réalité ? Si tu étais incapable de sortir d'un de ces rêves, comme ferais-tu la différence entre le monde réel et le monde des rêves ?
N'as-tu jamais fait un de ces rêves qui ont l'air plus vrai que la réalité ? Si tu étais incapable de sortir d'un de ces rêves, comme ferais-tu la différence entre le monde réel et le monde des rêves ?