Partage
  • Partager sur Facebook
  • Partager sur Twitter

Code César

Problème décodage

Sujet résolu
    26 mars 2009 à 18:35:08

    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! :euh:


    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 ;)

    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2009 à 18:45:09

      Salut :)

      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.
      • Partager sur Facebook
      • Partager sur Twitter
        26 mars 2009 à 18:48:13

        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);
        	}
        }
        


        • Partager sur Facebook
        • Partager sur Twitter
          26 mars 2009 à 18:52:07

          Oui j'ai rectifié, mais faire +1 ou +clef c'est pas franchement différent :p
          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 ?)
          • Partager sur Facebook
          • Partager sur Twitter
            26 mars 2009 à 18:53:45

            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)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              26 mars 2009 à 19:03:53

              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.
              • Partager sur Facebook
              • Partager sur Twitter
                26 mars 2009 à 19:19:21

                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.

                Bon courage néanmoins.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 mars 2009 à 19:45:05

                  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.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mars 2009 à 20:40:21

                    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 ^^
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Code César

                    × 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.
                    • Editeur
                    • Markdown