Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chiffre de Delastelle

Algo...

Anonyme
    12 juillet 2007 à 12:37:48

    Bonjour,

    Je cherche à coder (en C++) une fonction qui chiffre suivant le chiffre de Delastelle (le déchiffrement n'est pas encore implémenté). J'ai auparavant codé une fonction qui chiffre et déchiffre un texte en utilisant le carré de Polybe (qui marche). La fonction fonctionne mais pour tester si le message chiffré est bien le bon, j'ai utilisé deux scripts JavaScript en tant que "référence":
    En voilà un;
    Et voilà l'autre.

    Tout d'abord, ces scripts ne font pas exactement la même chose: le premier le J par le I (donc version anglaise) et le second remplace le W par le V (donc version française). Heureusement, mon algo est souple et il prend en paramètre:
    - Une référence vers le texte à coder
    - Une référence vers le texte codé
    - La grille de codage (ou le mot clé qui la définit, car mon algo sait générer une grille à partir d'un mot-clé)
    - La longueur des séries (conventionnellement 5)
    - Le caractère à remplacer (W ou J par exemple)
    - Le caractère de remplacement (V ou I par exemple)

    Mais les résultats obtenus ne sont pas les mêmes avec les scripts JavaScript et mon algo.

    Le code de l'algo (j'ai mis des "cout" un peu partout pour rechercher mes erreurs):
    if(longueurDeSeries) //Petite vérification...
        {
            string grilleTraite = "";
            bool alphabet[26] = { false };// Cette lettre fait-elle déjà partie de la grille ?
            char remplacement[] = { caractereDeRemplacement, '\0' };

            //Remplacement du caractèreASupprimer dans la grille
            while(grille.find(caractereASupprimer, 0)!=string::npos)// Tant qu'il y a un mauvais caractère dans le texte
                 grille.replace(grille.find(caractereASupprimer, 0), 1, remplacement);//On le remplace


            //Traitement de la grille
            for(int i = 0; i!=grille.size(); i++)
            {
                if(i<26 && !alphabet[tolower(grille[i])-'a'] && grille[i] != caractereASupprimer)
                {
                    grilleTraite += tolower(grille[i]);
                    alphabet[tolower(grille[i])-'a'] = true;
                }
            }
            if(grilleTraite.size()<26)
                for(int i = 0; i!=26; i++)
                    if(!alphabet[i] && i != caractereASupprimer-'a')
                    {
                        grilleTraite += 'a'+i;
                        alphabet[i] = true;
                    }
            cout << "Grille:" << grilleTraite << endl;

            //Remplacement du caractèreASupprimer dans le texteAcoder
            while(texteAcoder.find(caractereASupprimer, 0)!=string::npos)// Tant qu'il y a un mauvais caractère dans le texte
                texteAcoder.replace(texteAcoder.find(caractereASupprimer, 0), 1, remplacement);//On le remplace

            //Codage
                string ligne, colone;
                int caracteresIgnores = 0; //Pour ignorer les caractères spéciaux (espaces...)
                //Première phase du codage: polybe réorganisé
                cout << "Premiere phase du codage:"<< endl;
                //Avant la boucle, on rajoute des nulles pour que la longueur du message soit
                //un multiple de longueurDeSeries
                for(; texteAcoder.size()%longueurDeSeries;)
                    texteAcoder += 'x';
                cout << "Nulles: "<< texteAcoder << endl;

                for(unsigned int i = 0; i!=texteAcoder.size(); i++)
                {
                    if(caractereAlphabetique(texteAcoder[i]))//Detection du caractère...
                    {
                        cout << i<<" ("<<i-caracteresIgnores<<"): ";
                        if((i-caracteresIgnores)%longueurDeSeries==0 && (i-caracteresIgnores)>0)
                        {
                            texteCode += ligne;
                            texteCode += colone;
                            texteCode += " ";
                            cout << "Concatenation: "<<texteCode<<", ";
                            ligne.erase();
                            colone.erase();
                        }
                        //Ligne
                        ligne += '0' + grilleTraite.find(tolower(texteAcoder[i]), 0)/5+1;
                        cout <<"ligne: "<<ligne<<", ";

                        //Colone
                        if((grille.find(tolower(texteAcoder[i]),0)+1)%5!=0)
                                colone += '0' + (grilleTraite.find(tolower(texteAcoder[i]),0)+1)%5;
                            else
                                colone += '5';
                         cout << "colone: " << colone << endl;
                    }
                    else{ //Ce caractère a été ignoré
                        caracteresIgnores++;
                    }
                }//Fin de la boucle

                //Comme on a jouté des nulles au texte codé, on peut concaténer les buffers sans se poser de question
                //car il y a forcément cinq caractères dans chaqun des buffers
                texteCode += ligne;
                texteCode += colone;

                cout << "Seconde phase:"<<endl;
                //Seconde phase: conversion en lettres
                texteAcoder = texteCode;
                texteCode.erase();
                cout << "Texte a coder: "<< texteAcoder<<", texte code: "<<texteCode << endl;

                polybe(texteAcoder, texteCode, grilleTraite, true);
                //Le dernier booléen signifie que la fonction va déchiffrer et pas chiffrer
                //Même si la fonction fonctionne en mode de déchiffrement, le "texte d'entrée" (donc ici le texte à déchiffrer)
                //est stocké dans l'argument texteAcoder (et donc le résultat, le texte déchiffré est stocké dans texteCode)

                cout << "Apres traitement, texte a coder: "<< texteAcoder<<", texte code: "<<texteCode << endl;


    Où est l'erreur ?

    Merci !
    • Partager sur Facebook
    • Partager sur Twitter

    Chiffre de Delastelle

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown