Cryptographie
ParaNova
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
ParaNova Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
ParaNova Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
Bonjour a tous,
Je suis actuellement en terminale et j'ai comme épreuve au BAC l'épreuve d' ISN (informatique et sciences du numérique).
J'ai choisi comme projet final la cryptographie en java en utilisant une fonction affine (pour l'instant je n'utilise que les majuscules)
Donc j'ai réussi a écrire la première partie de l'algorithme qui permet de coder, en utilisant le code ascii de chaque lettre. Donc je rentre mon a et mon b pour pouvoir faire y=ax + b (y est le code ascii codé et x le code ascii non changé)
Voila la formule que j'utilise : MessageCode = MessageCode + (char)((((a * MessageInter[i]) -65 + b) %26) +65);
MessageCode étant le message codé, et MessageInter[i] le code ascii de ma lettre, et que je prend dans un tableau au préalable défini .
Ensuite le messagecode est de nouveau transformé en lettre et mon message est codé : tout cela marche
Mon problème est pour le décodage. Utilisant un modulo, je ne peux pas faire l'inverse du modulo donc j'ai décider d'utiliser un tableau a double dimension: dans la première ligne, le code ascii de mes lettres non codées et dans la seconde mes lettres codées.
Mais je n'arrive pas a faire en sorte que, lorsque je rentre une lettre, il décode le code ASCII, "remonte d'une ligne" pour trouver le code ascii correspondant non coder et ensuite le transformer en lettre.
Donc en résumé ça ferait: Je rentre une lettre ---- il trouve son code ascci --- il remonte d'une ligne --- trouve son code ascii non codé --- transforme en lettre
Voila l'algorithme entier :
Pouvez vous m'aider a le terminer svp ? Si vous voulez que je vous envoie le .jvs par mail, dites le moi
Merci de votre aide
Florian
Je suis actuellement en terminale et j'ai comme épreuve au BAC l'épreuve d' ISN (informatique et sciences du numérique).
J'ai choisi comme projet final la cryptographie en java en utilisant une fonction affine (pour l'instant je n'utilise que les majuscules)
Donc j'ai réussi a écrire la première partie de l'algorithme qui permet de coder, en utilisant le code ascii de chaque lettre. Donc je rentre mon a et mon b pour pouvoir faire y=ax + b (y est le code ascii codé et x le code ascii non changé)
Voila la formule que j'utilise : MessageCode = MessageCode + (char)((((a * MessageInter[i]) -65 + b) %26) +65);
MessageCode étant le message codé, et MessageInter[i] le code ascii de ma lettre, et que je prend dans un tableau au préalable défini .
Ensuite le messagecode est de nouveau transformé en lettre et mon message est codé : tout cela marche
Mon problème est pour le décodage. Utilisant un modulo, je ne peux pas faire l'inverse du modulo donc j'ai décider d'utiliser un tableau a double dimension: dans la première ligne, le code ascii de mes lettres non codées et dans la seconde mes lettres codées.
Mais je n'arrive pas a faire en sorte que, lorsque je rentre une lettre, il décode le code ASCII, "remonte d'une ligne" pour trouver le code ascii correspondant non coder et ensuite le transformer en lettre.
Donc en résumé ça ferait: Je rentre une lettre ---- il trouve son code ascci --- il remonte d'une ligne --- trouve son code ascii non codé --- transforme en lettre
Voila l'algorithme entier :
void main() {
clear();
int MessageInter [];
MessageInter = new int [100];
//Taille limitée à 100 pour le message à crypter
int i,c,a,b;
c = readInt("Tapez: 1 pour Cryptage | 2 pour Décryptage");
a = readInt("quelle valeur de a voulez vous prendre?");
b = readInt("quelle valeur de b voulez vous prendre");
char alphabet_code [] [];
//déclaration du tableau
alphabet_code = new char [2] [100];
// deux colones 100 ligne
if (c ==1) {
String MessageClair;
// Déclaration des variables
String MessageCode = "";
//vaut 0
println("Texte à crypter ?");
// Demande du message e
MessageClair = readString();
// demande le message a coder
println("Le message à crypter est" + "\n" + MessageClair);
// On sépare chaque caractère du message et on met son code ascii décalé de 65 dans le tableau
for (i =0; i <= MessageClair.length() -1; i ++) {
//message en lettre transformé en chiffre
MessageInter[i] = (int)(MessageClair.charAt(i));
}
for (i =0; i <= MessageClair.length() -1; i ++) {
MessageCode = MessageCode + (char)((((a * MessageInter[i]) -65 + b) %26) +65);
//prend la première lettre transformée
//de chiffre fais - 65
//(pour mettre a=0) puis clef donne le décalage ,
//modulo 26 pour etre compris dans l'alfabet + 65 pour repasser en ascii
}
// Affichage du résultat.
println("Le cryptogramme est" + "\n" + MessageCode);
}
if (c ==2) {
for (int k =0; k <=1; k ++) {
if (k ==0) {
for (int j =0; j <=25; j ++) {
alphabet_code[k] [j] = (char)(j +65);
// remplissage de la première colone avec les majuscules
}
} else {
for (int j =0; j <=25; j ++) {
alphabet_code[k] [j] = (char)((a * j + b) %26 +65);
// remplissage deuxième colonne avec les majuscules codées
System.out.println(alphabet_code [k] [j]);
//affiche le tableau
}
}
}
}
String Message;
println("Texte à décrypter ?");
Message = readString();
}
//message inter message mis en chiffre millieu
//message clair message qu'on veur coder depart
//message code: finalité fin
Pouvez vous m'aider a le terminer svp ? Si vous voulez que je vous envoie le .jvs par mail, dites le moi
Merci de votre aide
Florian
3 réponses
Bonsoir,
"Utilisant un modulo, je ne peux pas faire l'inverse du modulo "
Mathématiquement ce n'est pas vrai. L'inverse modulaire existe, mais tu ne dois pas prendre n'importe quelle valeur de a. Il faut que u existe tel que a*u ≡ 1 [26] pour pouvoir faire y ≡ a*x+b [26] pour le cryptage et x ≡ (y-b)*u [26] pour le décryptage.
Passons à ta formule :
Ton parenthèsage me dérange. Tu devrais plutôt avoir :
Ce qui en se décomposant donne :
Remarque : pour plus de lisibilité dans ton code tu devrais mettre directement 'A' à la place de 65, on comprendrais mieux le rôle de cette valeur.
"Utilisant un modulo, je ne peux pas faire l'inverse du modulo "
Mathématiquement ce n'est pas vrai. L'inverse modulaire existe, mais tu ne dois pas prendre n'importe quelle valeur de a. Il faut que u existe tel que a*u ≡ 1 [26] pour pouvoir faire y ≡ a*x+b [26] pour le cryptage et x ≡ (y-b)*u [26] pour le décryptage.
Passons à ta formule :
MessageCode = MessageCode + (char)((((a * MessageInter[i]) -65 + b) %26) +65);
Ton parenthèsage me dérange. Tu devrais plutôt avoir :
MessageCode = MessageCode + (char) ((a*(MessageInter[i]-65)+b)%26+65);
Ce qui en se décomposant donne :
char c = MessageInter[i]; int x = c - 'A'; int y = (a*x + b) % 26; char d = y + 'A';
Remarque : pour plus de lisibilité dans ton code tu devrais mettre directement 'A' à la place de 65, on comprendrais mieux le rôle de cette valeur.
Merci de ta réponse,
Je changerai le 65 par le A.
Le problème avec l'inverse modulaire, c'est que le but est que pour n'importes quelles valeurs de a et de b, je puisse décrypter: d'ou l'idée de tableau, mais je n'ai pas encore réussi a le terminer
Je changerai le 65 par le A.
Le problème avec l'inverse modulaire, c'est que le but est que pour n'importes quelles valeurs de a et de b, je puisse décrypter: d'ou l'idée de tableau, mais je n'ai pas encore réussi a le terminer
Mathématiquement tu ne pourras pas décrypter si a n'est pas inversible.
Par exemple si a=2 (non inversible), tu peux avoir x=6 et x=19 qui donneront tous les deux y=12+b.
Donc si ton cryptage donne y=12+b, tu ne pourras pas décrypter car tu ne sauras pas si x=6 ou 9.
Tu auras ce genre de problème pour toutes les valeurs de a qui ne sont pas inversibles !
Si tu veux creuser l'idée de ton tableau, cherches toi un module n qui accepte autant de nombres inversibles que de valeurs de a autorisées. Dans ce cas b pourra prendre n'importe quelle valeur entre 1 et n.
Par exemple, si tu veux conserver n=26, il n'y aura que 12 inverses possibles (même si certains comme 1 ou 25 sont peu intéressants). Tu pourrais donc limiter le choix de a à 10 et associer à chaque valeur de a choisie l'un des 10 inverses que tu auras mis dans ton tableau.
Par exemple si a=2 (non inversible), tu peux avoir x=6 et x=19 qui donneront tous les deux y=12+b.
Donc si ton cryptage donne y=12+b, tu ne pourras pas décrypter car tu ne sauras pas si x=6 ou 9.
Tu auras ce genre de problème pour toutes les valeurs de a qui ne sont pas inversibles !
Si tu veux creuser l'idée de ton tableau, cherches toi un module n qui accepte autant de nombres inversibles que de valeurs de a autorisées. Dans ce cas b pourra prendre n'importe quelle valeur entre 1 et n.
Par exemple, si tu veux conserver n=26, il n'y aura que 12 inverses possibles (même si certains comme 1 ou 25 sont peu intéressants). Tu pourrais donc limiter le choix de a à 10 et associer à chaque valeur de a choisie l'un des 10 inverses que tu auras mis dans ton tableau.