Algoritme Cryptage
Résolu/Fermé6 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
4 oct. 2015 à 15:56
4 oct. 2015 à 15:56
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...
Utilisateur anonyme
Modifié par EchoIsON le 5/10/2015 à 20:48
Modifié par EchoIsON le 5/10/2015 à 20:48
Merci pour ta réponse, c'est plus clair. Pour la remarque, tu pourrais me donner un exemple de boucle s'il te plait ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
5 oct. 2015 à 21:41
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...
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(); } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
5 oct. 2015 à 21:51
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.
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.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
Utilisateur anonyme
5 oct. 2015 à 21:56
5 oct. 2015 à 21:56
C'est le début de la boucle qui le spécifie :
En français : "pour chaque lettre c allant de 'A' jusqu'à 'Z' inclus, pris une par une"
for (char c = 'A'; c <= 'Z'; c++)
En français : "pour chaque lettre c allant de 'A' jusqu'à 'Z' inclus, pris une par une"
Utilisateur anonyme
5 oct. 2015 à 22:55
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
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 6/10/2015 à 07:36
Modifié par KX le 6/10/2015 à 07:36
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(); } }
Utilisateur anonyme
Modifié par EchoIsON le 6/10/2015 à 22:02
Modifié par EchoIsON le 6/10/2015 à 22:02
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 6/10/2015 à 22:04
Modifié par KX le 6/10/2015 à 22:04
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 ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
6 oct. 2015 à 22:42
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...
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
Modifié par EchoIsON le 27/12/2015 à 12:38
Modifié par EchoIsON le 27/12/2015 à 12:38
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 déc. 2015 à 21:03
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
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
Utilisateur anonyme
Modifié par EchoIsON le 29/01/2016 à 23:17
Modifié par EchoIsON le 29/01/2016 à 23:17
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.
Modifié par EchoIsON le 5/10/2015 à 21:35
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
5 oct. 2015 à 21:49
Les ? étant bien sûr à remplacer par la bonne valeur :
"C-BF00" pour "A" et "D-CG11" pour "B"