Bonjour a tous,

j'ai réalisé un programme qui permet de crypter un message en vigenere.
Mes fonctions sont bonnes, mais je pense qu'elle ne sont pas optimisées.
De plus j'ai essayé d'améliorer mon main en laissant le choix à l'utilisateur. J'ai donc bien pris soin d'éviter les erreurs mais cela provoque une boucle infinie, en effet mon code doit redemander à l'utilisateur son choix s'il ne rentre pas une valeur correcte. Si l'utilisateur rentre un int supérieur a 2 tout est bon le programme me redemande mon choix mais si je met un char ma boucle while ne s'arrête plus (malgré mon try catch) et je ne vois pas du tout pourquoi.

Voici mon code :

mon main : (avec ça boucle while qui bug)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.InputMismatchException;
import java.util.Scanner;
 
public class Main 
{
 
	public static void main(String[] args) 
	{
		//Menu :
		int rep= 0;
		Scanner sc = new Scanner(System.in);
		System.out.print("Que souhaitez vous faire ? \n\t 1.Crypter un message.\n\t 2.Décrypter un message.\n\t 3.Quitter\n\t");
	 	try{
	 		rep = sc.nextInt();
	 	}catch(InputMismatchException e)
	 	{
	 		rep=0;
	 	}
 
	 	while(rep!= 1 & rep!=2 & rep!=3)
	 	{
			System.out.print("Entrée incorrecte. \nQue souhaitez vous faire ? \n\t 1.Crypter un message.\n\t 2.Décrypter un message.\n\t 3.Quitter\n\t");
		 	try{
		 		rep = sc.nextInt();
		 	}catch(InputMismatchException e)
		 	{
		 		rep=0;
		 	}
	 	}
 
		switch(rep)
		{
			//Si nous souhaitons crypter :
	 		case 1 : 
	 			Cryptage cryptage = new Cryptage();
	 			System.out.print("Entrez votre message : \n\t");
	 			String message = sc.nextLine();
	 			message = sc.nextLine();
	 			System.out.print("Choisissez votre clef : \n\t");
	 			String clef = sc.nextLine();
	 			System.out.print("Message crypté : "+Cryptage.vigenere(message, clef));
	 		break;
 
	 		//Si nous souhaitons decrypter
	 		case 2 : 
	 			Decryptage decryptage = new Decryptage();
	 		break;
 
	 		//Si nous souhaitons quitter : 
	 		default :
 
		}
	}
}
Ma classe Cryptage : ( avec un manque d'optimisation)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public class Cryptage {
 
	private static String uniformisation(String message)
	{	
		//Cette fonction permet d'uniformiser le message a coder afin qu'il soit cryptable par la methode de Vigenere : 
		message=message.toLowerCase();
		message=message.replace('ç','c');
		message=message.replace('é','e');
		message=message.replace('ë','e');
		message=message.replace('è','e');
		message=message.replace('ê','e');
		message=message.replace('à','a');
		message=message.replace('â','a');
		message=message.replace('ä','a');
		message=message.replace('ù','u');
		message=message.replace('û','u');
		message=message.replace('ü','u');
		message=message.replace('ï','i');
		message=message.replace('î','i');
		message=message.replace('ô','o');
		message=message.replace('ö','o');
		message=message.replaceAll("£", "livre sterling");
		message=message.replaceAll("0", "zeros");
		message=message.replaceAll("1", "un");
		message=message.replaceAll("2", "deux");
		message=message.replaceAll("3", "trois");
		message=message.replaceAll("4", "quatre");
		message=message.replaceAll("5", "cinq");
		message=message.replaceAll("6", "six");
		message=message.replaceAll("7", "sept");
		message=message.replaceAll("8", "huit");
		message=message.replaceAll("9", "neuf");
		message=message.replaceAll("@", "at");
		message=message.replaceAll("&", "et");
		for(int i = 33; i<97;i++){message=message.replace(((char)i), ' ');}
		for(int i = 123;i<127;i++){message=message.replace(((char)i), ' ');}
		message=message.replaceAll(" ","");
 
 
		return message;
	}
 
	public static String vigenere(String message, String clef)
	{
		//Creation des variables :
		String messageCrypte = "";
		int compteur = 0;
		final char vigenereUn[] = {'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'};
		char vigenereDeux[] = new char[26];
		boolean rep = false;
 
		//Verification de la clef :
		for(int i = 0; i<clef.length();i++)
			if(clef.charAt(i)!=' ')
				rep=true;
 
		if(rep==false || clef==null)
		{
			//Initialisation de la clef :
			for(int i=0; i<message.length(); i++)
			{
				int j=(int)(Math.random()*25+1);
				clef+=vigenereUn[j];
			}
 
			//La clef etant generee par le programme elle est donnee a l'utilisateur: 
			System.out.println("Clef générée : "+clef+"\n");
		}
 
		//Uniformisation du message :
		message=uniformisation(message);
 
//		//Test du message uniformise : 
//		System.out.println("Message uniformisé : "+message);
 
		//Uniformisation de la clef :
		clef=uniformisation(clef);
 
//		//Test de la clef uniformisee : 
//		System.out.println("Clef uniformisée : "+clef);
 
		//Extension de la clef pour qu'elle ait la meme taille que le message a crypter :
		if(clef.length()< message.length())
			for(int i=clef.length(); i<message.length(); i++)
				clef+=clef.charAt(i%clef.length());
 
//		//Test de l'extension de la clef :
//		System.out.println("Clef etendue :\n"+clef+".\nTaille message : "+message.length()+"\nTaille de la clef : "+clef.length()+"\n");
 
		//Cryptage du message :
		while(compteur<message.length())
		{ 	
			//Réorganisation de vegenereDeux pour obtenir la ligne utile au cryptage :
			for(int i=0; i<26; i++)
				if(clef.charAt(compteur)==vigenereUn[i])
				{
					vigenereDeux[0]=vigenereUn[i];
					int j=0;
 
					for(int k=1; k<26; k++)
					{
						vigenereDeux[k]=(char)(vigenereDeux[0]+k);
 
						if(vigenereDeux[k]>'z')
						{
							vigenereDeux[k]=vigenereUn[0+j];
							j++;
						}
					}
 
					j=vigenereUn.length;
				}	
 
			//application du principe de vegenere :
			for (int i=0; i<26; i++)
				if(message.charAt(compteur)==vigenereUn[i])
				{
					messageCrypte+=vigenereDeux[i];
					i=vigenereUn.length;
				}	
 
			compteur++;
 
//		    //Test de VigenereDeux :
//			System.out.print("VigenereDeux num "+compteur+" :\n"); for(int i=0; i<26; i++){System.out.print(vigenereDeux[i]);} System.out.print("\n\n");
		}
 
//	    //Test de VigenereUn :
//		System.out.print("VigenereUn :\n"); for(int i=0; i<26; i++){System.out.print(vigenereUn[i]);} System.out.print("\n\n");
 
		return messageCrypte;
		}
	}
je ne vous envoie pas ma classe Decryptage car pour le moment je n'ai rien implémenté.

merci d'avance pour vos réponses.