Algoritme Cryptage
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
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 :
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
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
A voir également:
- Algoritme Cryptage
- Programme de cryptage hellobox - Forum Réseaux sociaux
- Cle de cryptage tv panasonic - Forum Réseau
- Comment je configure ma télévision Panasonic a mon wifi - Forum Téléviseurs
- Cryptage en cours caméra ✓ - Forum Caméra
- Impossible de connecter ma télé Panasonic viera ✓ - Forum Téléviseurs
6 réponses
Bonjour,
Quand tu fais
Exemple :
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 :
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...
Quand tu fais
x.replace(y,z)seules les chaînes
yde
xvont ê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...
Merci pour ta réponse, c'est plus clair. Pour la remarque, tu pourrais me donner un exemple de boucle s'il te plait ?
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...
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(); } }
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.
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.
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
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
En effet, je mentionnai ce problème dès ma première réponse :
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 :
Et c'est là qu'on voie qu'un code avec des boucles est plus simple à changer qu'un code avec des copier-coller :
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(); } }
Pour le decryptage, j'ai fait une liste de String pour chaque lettre abcd etc du type :
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
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
Si tu as encore la Map il suffit de l'utiliser dans l'autre sens.
C'est quand même plus simple que tes String, non ?
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 ?
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
Comme cela j'initialise chaque méthode avec celle au dessus
De cette façon :
EchoIsON
Au lieu de créer trois classes différentes, je ne peux pas créer trois
public static voiddiffé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
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
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
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.
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.
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
Les ? étant bien sûr à remplacer par la bonne valeur :
"C-BF00" pour "A" et "D-CG11" pour "B"