Algoritme Cryptage

Résolu/Fermé
Utilisateur anonyme - 4 oct. 2015 à 14:58
 Utilisateur anonyme - 29 janv. 2016 à 23:16
Bonjour,

J'aimerais crée mon propre algorithme de cryptage en Java.
L'algorithme marche mais mon problème est lors de l'affichage du résultat, pourriez vous m'aider s'il vous plait ?
Lors de l'affichage du cryptage, j'ai chaque terme qui AURAIT pu être utilisé.
Par exemple, lorsque j'entre "ABC" en mot de passe, mon algorithme devrait me retourner A crypté, B crypté, et C crypté, c'est tout ! Sauf qu'il retourne toutes les autres lettres de l'alphabet, c'est à dire toutes les autres variables que j'ai crée, telles qu'elles sont (l'utilisateur n'a rien entré, donc rien à remplacer).
Voici mon code complet :

import java.util.Scanner;

public class echo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String U[] = {"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"};
		System.out.println("Cryptage");
		System.out.println("----------------------");
		System.out.println("Entrez votre mot de passe :");
		String a = new String();
		String b = new String();
		String c = new String();
		String d = new String();
		String e = new String();
		String f = new String();
		String g = new String();
		String h = new String();
		String j = new String();
		String k = new String();
		String l = new String();
		String m = new String();
		String n = new String();
		String o = new String();
		String p = new String();
		String q = new String();
		String r = new String();
		String s = new String();
		String t = new String();
		String u = new String();
		String v = new String();
		String w = new String();
		String x = new String();
		String y = new String();
		String z = new String();
		String zz = new String();
		
		String i = sc.nextLine();
		System.out.println("Cryptage en cours...");
		i = i.toUpperCase();
		a = i.replace(U[0],U[0+2]+"-"+U[0+1]+U[0+5]+"00");
		b = i.replace(U[1],U[1+2]+"-"+U[1+1]+U[1+5]+"11");
		c = i.replace(U[2],U[2+2]+"-"+U[2+1]+U[2+5]+"22");
		d = i.replace(U[3],U[3+2]+"-"+U[3+1]+U[3+5]+"33");
		e = i.replace(U[4],U[4+2]+"-"+U[4+1]+U[4+5]+"44");
		f = i.replace(U[5],U[5+2]+"-"+U[5+1]+U[5+5]+"55");
		g = i.replace(U[6],U[6+2]+"-"+U[6+1]+U[6+5]+"66");
		h = i.replace(U[7],U[7+2]+"-"+U[7+1]+U[7+5]+"77");
		j = i.replace(U[8],U[8+2]+"-"+U[8+1]+U[8+5]+"88");
		k = i.replace(U[9],U[9+2]+"-"+U[9+1]+U[9+5]+"99");
		l = i.replace(U[10],U[10+2]+"-"+U[10+1]+U[10+5]+"10");
		m = i.replace(U[11],U[11+2]+"-"+U[11+1]+U[11+5]+"20");
		n = i.replace(U[12],U[12+2]+"-"+U[12+1]+U[12+5]+"30");
		o = i.replace(U[13],U[13+2]+"-"+U[13+1]+U[13+5]+"40");
		p = i.replace(U[14],U[14+2]+"-"+U[14+1]+U[14+5]+"50");
		q = i.replace(U[15],U[15+2]+"-"+U[15+1]+U[15+5]+"60");
		r = i.replace(U[16],U[16+2]+"-"+U[16+1]+U[16+5]+"70");
		s = i.replace(U[17],U[17+2]+"-"+U[17+1]+U[17+5]+"80");
		t = i.replace(U[18],U[18+2]+"-"+U[18+1]+U[18+5]+"90");
		u = i.replace(U[19],U[19+2]+"-"+U[13+1]+U[19+5]+"01");
		v = i.replace(U[20],U[20+2]+"-"+U[20+1]+U[20+5]+"02");
		w = i.replace(U[21],U[21-2]+"-"+U[21-1]+U[21-5]+"03");
		x = i.replace(U[22],U[22-2]+"-"+U[22-1]+U[22-5]+"04");
		y = i.replace(U[23],U[23-2]+"-"+U[23-1]+U[23-5]+"05");
		z = i.replace(U[24],U[24-2]+"-"+U[24-1]+U[24-5]+"06");
		zz = i.replace(U[25],U[25-2]+"-"+U[25-1]+U[25-5]+"07");

		System.out.println(a+b+c+d+e+f+g+h+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+zz);
	}
 }



/*
 * i = i.replace(U[0],U[0+2]+"-"+U[0+1]+U[0+5]+"00");
 */


Et voici mon problème (lorsque je met ABC en mot de passe par exemple) :

Entrez votre mot de passe :
abc
Cryptage en cours...
C-BF00BCAD-CG11CABE-DH22ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC
PS : Ne crée qu'une seule variable pour tout revient à remplacer les caractère de cryptage encore et encore (boucle infinie)
Ce qui est en gras est ce qui ne devrait pas être là.
Merci de bien vouloir m'aider,

EchoIsON

6 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 oct. 2015 à 15:56
Bonjour,

Quand tu fais
x.replace(y,z)
seules les chaînes
y
de
x
vont être remplacées par
z
, toutes les autres lettres restent en place.

Exemple :
"ABC".replace("A","?"); // "?BC"
"ABC".replace("B","?"); // "A?C"
"ABC".replace("C","?"); // "AB?"
"ABC".replace("D","?"); // "ABC"

Du coup si tu fais la concaténation de tout tu vas avoir "?BCA?CAB?ABC"...

Si j'ai bien compris ce que tu voulais faire tu devrais plutôt avoir :

if (i.contains(U[0]))
    a = U[0+2]+"-"+U[0+1]+U[0+5]+"00";

Auquel cas, "ABC" sera remplacé par "C-BF00D-CG11E-DH22".

Mais attention :
"BCA" ou "AABABCBC" vaudront aussi "C-BF00D-CG11E-DH22" !
En effet ta somme a+b+c+d... prends en compte l'ordre de l'alphabet, pas celui des lettres telles qu'elles apparaissent dans le mot à "crypter".
Du coup le décryptage est impossible...

Remarque : faire 26 String pour chaque lettre ça donne un code très compliqué à développer et comprendre.
Dans ton cas une Map et quelques boucles for seraient les bienvenues...
1
String i = sc.nextLine();
  System.out.println("Cryptage en cours...");
  i = i.toUpperCase();
  if (i.contains(U[0]))
      a = i.replace(U[0], U[0+2]+"-"+U[0+1]+U[0+5]+"00");
  if (i.contains(U[1]))
   b = i.replace(U[1], U[1+2]+"-"+U[1+1]+U[1+5]+"11");

  System.out.println(a+b+c+d+e+f+g+h+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+zz);


Avec ce code, en entrant ab j'obtiens comme résultat :
C-BF00BAD-CG11

Avec ba :
BC-BF00D-CG11A

En fait, le programme crypte bien avec if (i.contains(U[x])), il ne met pas les variables inutiles etc, sauf qu'il crypte le caractère mais le remet en original juste à coté...
Avec ba il met B au debut et A à la fin, avec ab c'est le contraire, il place BA au centre entre les deux cryptages

EDIT :
En entrant abbbb en mot de passe j'obtiens :
C-BF00BBBBAD-CG11D-CG11D-CG11D-CG11
Le probleme survient au debut seulement et disparait à la fin
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
5 oct. 2015 à 21:49
C'est normal, comme je l'ai indiqué hier, le replace prends juste ce que tu cherches et le remplace, mais le reste est conservé.

"AB".replace("A","?"); // "?B"
"AB".replace("B","?"); // "A?"
"ABBBB".replace("A","?"); // "?BBB"
"ABBBB".replace("B","?"); // "A????"

Les ? étant bien sûr à remplacer par la bonne valeur :
"C-BF00" pour "A" et "D-CG11" pour "B"
0
Merci pour ta réponse, c'est plus clair. Pour la remarque, tu pourrais me donner un exemple de boucle s'il te plait ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
5 oct. 2015 à 21:41
Pour l'exemple, ce code devrait (sauf erreur) faire la même chose que le tien.
Remarque : je n'utilises que 3 variables, ça suffit...

import java.util.Scanner;

public class echo {
    public static void main(String[] args) {
        System.out.print("Entrez votre mot de passe : ");

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine().toUpperCase();

        for (char c = 'A'; c <= 'Z'; c++) {
            if (line.indexOf(c) == -1) // si la lettre n'est pas dans le mot
                continue; // on passe à la lettre suivante

            if (c <= 'U') // U[0+2]+"-"+U[0+1]+U[0+5]
                System.out.printf("%c-%c%c", c+2, c+1, c+5);
            else // U[25-2]+"-"+U[25-1]+U[25-5]
                System.out.printf("%c-%c%c", c-2, c-1, c-5);

            if (c <= 'J') // "00" à "99"
                System.out.printf("%d%d", c-'A', c-'A');
            else if (c <= 'S') // "10" à "90"
                System.out.printf("%d0", c-'J');
            else // "01" à "07"
                System.out.printf("0%d", c-'S');
        }

        System.out.println();
    }
}
0
Utilisateur anonyme
5 oct. 2015 à 21:48
Merci beaucoup ! Ce code retourne 0 erreur, le cryptage fonctionne très bien ! Je peux juste savoir qu'est ce que, dans ce code, remplace la lettre par le cryptage ? Enfin, l'equivalent du "replace" dans mon code
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
5 oct. 2015 à 21:51
Dans ton code tu affiches a+b+c+d+e+f+... et c'est dans ces différentes variables que tu faisais tes replace à partir de i (la ligne lue).

Moi ce que je fais c'est l'affichage au fur et à mesure. Donc pour chaque lettre c je fais plusieurs System.out.print qui écrivent progressivement le résultat en même temps que je le calcule.
0
Utilisateur anonyme
5 oct. 2015 à 21:53
Merci je comprend mieux.
Désolé, une derniere question :
Dans ce code, comment le programme sait qu'on travaille sur toutes les lettres de l'alphabet ? C'est un systeme deja présent dans le Java ?
Car on n'a pas eu à faire un tableau avec toutes les lettres.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > Utilisateur anonyme
5 oct. 2015 à 21:56
C'est le début de la boucle qui le spécifie :

for (char c = 'A'; c <= 'Z'; c++)

En français : "pour chaque lettre c allant de 'A' jusqu'à 'Z' inclus, pris une par une"
0
Utilisateur anonyme
5 oct. 2015 à 22:55
Re-Bonsoir,

Comme ma question est en rapport avec le même sujet, je ne rouvre pas de nouvelle discussion...
Suite à la discussion précédente, je rencontre un nouveau problème :
Une lettre double n'est traitée qu'une fois.
Lorsque j'execute le code, et que mon mot de passe est aaa, le programme me crypte a seulement, en une fois.
Pareil avec les chiffres... Quelqu'un peut me dire comment me debarasser de ce leger probleme svp ?

Merci beaucoup
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 6/10/2015 à 07:36
En effet, je mentionnai ce problème dès ma première réponse :
Mais attention :
"BCA" ou "AABABCBC" vaudront aussi "C-BF00D-CG11E-DH22" !
En effet ta somme a+b+c+d... prends en compte l'ordre de l'alphabet, pas celui des lettres telles qu'elles apparaissent dans le mot à "crypter".

La question est donc de savoir quel résultat tu attends ?

Quelque chose comme cela j'imagine ?
AB → C-BF00D-CG11
BA → D-CG11C-BF00 (jusqu'à présent tu avais C-BF00D-CG11 comme pour AB)
ABAB → C-BF00D-CG11C-BF00D-CG11

On en revient donc à la première partie de ma remarque :
Dans ton cas une Map et quelques boucles for seraient les bienvenues...

Et c'est là qu'on voie qu'un code avec des boucles est plus simple à changer qu'un code avec des copier-coller :

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class echo {
    public static void main(String[] args) {

        Map<Character, String> converter = new TreeMap<>();

        for (char c = 'A'; c <= 'Z'; c++) {

            String s;

            if (c <= 'U')
                s = String.format("%c-%c%c", c+2, c+1, c+5);
            else
                s = String.format("%c-%c%c", c-2, c-1, c-5);

            if (c <= 'J')
                s += String.format("%d%d", c-'A', c-'A');
            else if (c <= 'S')
                s += String.format("%d0", c-'J');
            else
                s += String.format("0%d", c-'S');

            converter.put(c, s);
        }

        //System.out.println(converter);

        System.out.print("Entrez votre mot de passe : ");

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine().toUpperCase();

        for (char c : line.toCharArray())
            System.out.print(converter.get(c));

        System.out.println();
    }
}
0
Utilisateur anonyme
6 oct. 2015 à 21:00
Merci, c'est exactement ce que je voulais. J'ai fait la meme chose pour les chiffres. Je vais creer un programme de decryptage maintenant.
Merci pour l'effort fait pour m'aider tout au long.
0
Pour le decryptage, j'ai fait une liste de String pour chaque lettre abcd etc du type :
String a = "C-BF00.";
String b = "D-CG11.";
String c = "E-DH22.";
String d = "F-EI33.";
...
String z = "X-YU07.";

Je m'appretais à creer deux boucles for (une pour les lettres et l'autre pour les chiffres, comme j'ai fait pour le cryptage)
Le fait que j'ai des variables String me derange vraiment... Cela m'arrangerait d'avoir des char, mais ici je ne peux pas definir "C-BF00." en char. Le programme me renvoie donc une tonne d'erreur et n'accepte pas que je remplace for (char c : line.toCharArray()) par (String zz : line.toString())
zz etant la variable String de la boucle for pour zz = a, la premiere variable String qui représente "C-BF00."
Je reste coincé là dessus pour le moment...
Sachant que j'ai conservé la fonction converter.put(x, y); dans le programme de decryptage.
Merci...

EDIT : Oui il y a des points "." a la fin a chaque fois c'est normal, je les ai ajoutés au cryptage a la fin de chaque expression
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 6/10/2015 à 22:04
Si tu as encore la Map il suffit de l'utiliser dans l'autre sens.

import java.util.Map.Entry;

String unknown = "D-CG11K-JN88P-OS40I-HL66Q-PT50";
for (Entry<Character, String> entry : converter.entrySet())
    unknown = unknown.replace(entry.getValue(), entry.getKey().toString());        
System.out.println(unknown);

C'est quand même plus simple que tes String, non ?
0
Utilisateur anonyme
6 oct. 2015 à 22:23
Je vais l'integrer a mon code et je donne le résultat ici, merci.
0
Utilisateur anonyme
6 oct. 2015 à 22:31
Mais, je garde les for du premier code ? Je veux dire, les boucles avec lesquelles on a crypter les caracteres
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
6 oct. 2015 à 22:42
Tout dépend si tu veux crypter ou décrypter...

La première boucle de remplissage de la Map tu la gardes, ensuite tu t'en sers comme tu veux, pour du cryptage, du décryptage ou les deux l'un après l'autre...
0
Utilisateur anonyme
6 oct. 2015 à 22:54
En fait je ne comprend pas pourquoi on met
String unknown = "D-CG11K-JN88P-OS40I-HL66Q-PT50";

Ne vaudrait-il pas mieux de laisser l'utilisateur decrypter un code en le laissant mettre ce que vaut unkown
sc.nextLine par exemple
0

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

Posez votre question
Bonjour, le sujet date, j'aimerais revenir sur un point...
Au lieu de créer trois classes différentes, je ne peux pas créer trois
public static void
différents dans une même classe ?
Comme cela j'initialise chaque méthode avec celle au dessus
De cette façon :
public class Main {
public static void main(String[] args) {
//comporte la Map
}
public static void Cryptage() {
//cryptage
}
public static void Decryptage() {
//decryptage
}
}


EchoIsON
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
30 déc. 2015 à 21:03
Bonjour,

Oui c'est possible, si j'avais fait plusieurs classes c'est parce que tu avais deux main différents (un pour le cryptage, l'autre pour le décryptage).

Revoir entre autre cette partie là de la discussion :
https://forums.commentcamarche.net/forum/affich-32605930-algoritme-cryptage#21
0
Bonsoir,
Merci.

Par ailleurs, j'ai ouvert un nouveau sujet sur le C++ (je ne sais pas si vous vous y connaissez) : https://forums.commentcamarche.net/forum/affich-33100578-nombres-premiers-c

Vous m'avez toujours bien expliqué donc je me demandais si vous passeriez par là si vous avez le temps (et l'envie evidemment)... De plus ma question a un rapport avec un de vos messages du 18 oct. 2014 à 14:29

Merci beaucoup,
EchoIsON.
0