IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Cryptographie sur Javascool


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut Cryptographie sur Javascool
    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 retransformer 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    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

    PS: désolé si le message n'est pas posté au bon endroit ..

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu sais, c'est impossible .

    Je ne comprends pas ton histoire de "remonter d'une ligne," mais importe... L'idée même ne marche pas.

    C'est pas du Java, c'est des maths. Supposons que ta fonction affine a*x +b soit 2*x + 0. Et que le code de A soit 0.
    On a donc, crytage de A : 2*0 + 0 mod 26 = 0. cryptage de B : 2*1 + 0 mod 26 = 1. ... Cryptage de N : 2*13 + 0 mod 26 = 0... Même cryptage que A.
    En tombant sur le code 0 tu deviens incapable de savoir si tu dois le décrypter en A ou en N. Pareil pour B et O, pareil pour C et P, etc.

    En termes de maths, ça veut dire quoi ?
    Tu as besoin, pour chaque entrée que tu cryptes, de savoir en quoi elle se décrypte. Ça veut dire que tu as besoin d'une fonction bijective.
    "Mais, une fonction affine est bijective !" => Oui, mais pas le modulo, que tu n'arrivais pas à inverser. Quand tu t'es rendu compte de ça c'était déjà fini, tu n'arrivais pas à l'inverser parce qu'il n'y a pas d'inverse. Ça ne peut pas marcher tant que tu mets du modulo dans le traitement.

    Et bien sûr le modulo n'est pas là par plaisir mais pour éviter de sortir des valeurs représentables : les codes ASCII de A à Z.
    Pour s'en sortir, il y a deux solutions :
    - S'arranger pour que le modulo ne donne pas les mêmes valeurs pour deux entrées différentes. En gros, rendre le traitement bijectif sur A à Z. Mais en gros, ça signifie que ta fonction affine ne peut avoir que des pentes multiples de 26 : 1 ou -1 ou 26 ou -26 ou 52 ou -52... Autrement dit la pente ne changera rien à l'entrée et seulement le terme b aura un effet. C'est donc juste un cryptage par décalage. Un simple rotation13 sauf que c'est pas forcément 13.

    - Accepter un espace de résultat plus grand que A à Z, plus exactement ceil(abs(a)) fois plus grand. Mais forcément, ça va être compliqué à représenter, surtout quand tu vas autoriser les minuscules et les accents.


    ... J'ai bien peur qu'une fonction affine ait beaucoup de défauts pour illustrer le cryptage -_-°
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut
    Je ne sais pas si je t'ai bien compris mais ayant fait les calculs a la main, on n'as jamais une valeur de A,B,C jusqu'a Z identiques.

    En effet, si tu prend a=3 et b=5, on as A: 3*0 + 5 %26 = 5, B: 3*1 + 5 %26 = 8

    En prenant ces valeurs de a et b, nous avons un décalage de 3 a chaque fois et a la lettre N (ou je ne sais plus laquelle), on tombe sur N=1 puis O=4. Donc nous n'avons jamais le même nombre.


    Ensuite quand je dis "remonter d'une ligne" je veux dire :

    par exemple, en prenant a=3 et b=5 j'ai A1= 0 B1=5 A2=1 B2=8 et ce pour tout l’alphabet

    Pour décoder, je rentre ma lettre codée, par exemple F (code ascii 70, donc 70-5 = 5) Donc l'ordinateur va voir 5, va l'associer à B1, "remonter d'une ligne" en A1 et voir que le code ascii non crypté de la lettre F est 0. Il va donc décrypter le F en A

    J'espère que j'ai été clair, si ce n'est pas le cas, j'essayerai de me réexpliquer

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Effectivement, je me suis planté dans ma formule. En fait il faut éviter les multiples de 2 et 13, facteurs premiers de 26. C'est vrai que ça a plus de sens comme ça.
    Mais bon tu aurais pu me dire ça au lieu de me dire "mais si ça marche." Je t'ai mis sous le nez un exemple où ça marche pas, tout de même -_-°.
    Je suggère de prévoir un message d'erreur pour les cas où le a ne marchera pas.


    Bon, pour ton problème. Tu as fait un tableau à deux dimension qui te permette de savoir à quelle lettre claire correspond une lettre cryptée. C'est inutile.
    Ce problème a une entrée : la lettre cryptée. Il a une sortie : la lettre claire correspondante. Dans les deux cas c'est une valeur de 0 à 25, soit 26 possibilités.

    Tu n'as pas besoin de deux dimensions. Dans un tableau une dimension est une entrée, et tu n'as pas deux entrées, tu en as une. Il te faut un tableau de taille 26, qui pour chaque index i, contient la lettre claire associée à la lettre chiffrée i.
    Pour remplir ce tableau c'est très simple : tu regardes toutes les lettres (de 0 à 25) et pour chacune d'elles tu calcule la lettre chiffrée correspondante. Puis après avoir fait ce calcul, tu remplis le tableau concernant cette lettre chiffrée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut
    Je ne comprend pas comment dans un tableau a une dimension je peux a la fois mettre les valeurs de la lettre non codé et les valeurs de la lettre codée: peux tu me montrer comment faire ou me donner une piste s'il te plait ?

    Bonne journée

    Florian

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableauDecodage[valeurCodee] = valeurDecodee;
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/05/2015, 18h37
  2. Démonstration sur les méthodes cryptographie
    Par BSaladin dans le forum Sécurité
    Réponses: 6
    Dernier message: 31/05/2012, 14h46
  3. application sur la cryptographie
    Par René Manassé dans le forum VB.NET
    Réponses: 2
    Dernier message: 15/07/2009, 10h22
  4. Voulez vous me proposer un travail sur la cryptographie?
    Par Midou45 dans le forum Mathématiques
    Réponses: 2
    Dernier message: 05/03/2008, 22h41
  5. cryptographie avec C sur UNIX
    Par xheo dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/04/2006, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo