Cryptographie

Fermé
ParaNova Messages postés 3 Date d'inscription dimanche 6 avril 2014 Statut Membre Dernière intervention 7 avril 2014 - Modifié par ParaNova le 6/04/2014 à 18:19
ParaNova Messages postés 3 Date d'inscription dimanche 6 avril 2014 Statut Membre Dernière intervention 7 avril 2014 - 7 avril 2014 à 17:53
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 :



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

Aranud87 Messages postés 18031 Date d'inscription dimanche 29 octobre 2006 Statut Contributeur Dernière intervention 7 juin 2020 3 293
6 avril 2014 à 18:17
Salut,
Pour des questions de visibilité, merci d'utiliser les balises code :
<code >
</code >
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 avril 2014 à 00:09
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 :
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.
0
ParaNova Messages postés 3 Date d'inscription dimanche 6 avril 2014 Statut Membre Dernière intervention 7 avril 2014
7 avril 2014 à 07:24
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 avril 2014 à 07:50
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.
0
ParaNova Messages postés 3 Date d'inscription dimanche 6 avril 2014 Statut Membre Dernière intervention 7 avril 2014
7 avril 2014 à 17:53
Oui je voit ce que tu veux dire

Je vais déjà essayer de décrypter avec certaines valeurs de a qui marchent et si j'ai le temps ensuite, je chercherais une solution a ce problème. Sinon je parlerais de ça comme une limite
0