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

C++ Discussion :

Chiffrement par substitution


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Par défaut Chiffrement par substitution
    Bonjour,

    Je réalise un TP actuellement sur la substitution par chiffrement, évolution du chiffrement par décalage de César. La substitution fonctionne ainsi: on possède un fichier .txt où se trouve "la clé" qui est composé dans une colonne de l'alphabet dans l'ordre, puis dans l'autre colonne, la lettre qui substitue celle de l'alphabet.
    En général, on a ça: AEBKCUDP.... où "A" sera substituté par "E", "B" par "K" et ainsi de suite.

    Ensuite, on a un chaîne de caractères stockée dans un string, et le but est d'appliquer la substitution à la chaîne de caractères. Mon intérêt est de passer par un foncteur et des itérateurs, puis plus tard par des algorithmes. Mon code actuel est le suivant, et je bloque clairement sur la substitution, alors que je n'ai pas eu ce problème pour le chiffrement par décalage (même si le dernier est plus simple).

    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
    #include <iostream>
    #include <string>
    #include <iterator>
    #include <fstream>
    using namespace std;
     
    int main()
    {
     
        // Le message a crypter
        string texte("TEXTE A TESTER");
     
        // Demande de la cle a l'utilisateur
        cout << "Quel fichier contenant la cle voulez-vous utiliser ? ";
        string nomFichier;
        cin >> nomFichier;
     
        ifstream fichier(nomFichier);
        istream_iterator<char> it(fichier);
        istream_iterator<char> end;
     
        string a;
        while (it != end)
        {
            a.push_back(*it);
            ++it;
        }
     
        for (int i =0; i < a.size(); i++)
        {
             if (i%2 == 0)
             {
                   a[i] = a[i+1];
              }
     
            cout << a[i];
         }
     
        return 0;
    }

    Déjà, j'ai un petit problème aussi avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichier(nomFichier);
    qui n'accepte pas mon string nomFichier. Je comprends pas pourquoi, quand je remplace par le nom du fichier "cle.txt", il n'y a pas de problème, et ifstream est censé recevoir du type string.

    Ensuite, ce que j'effectue dans ma boucle for, j'aimerai l'effectuer dans ma boucle while, c'est à dire que je ne souhaite pas passer par du string pour parcourir la chaîne via les index, mais par la boucle while avec l'itérateur.

    Dans l'attente de toutes vos réponses, je reste à l'écoute!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Hello,
    Citation Envoyé par alexandrempg Voir le message
    Déjà, j'ai un petit problème aussi avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichier(nomFichier);
    qui n'accepte pas mon string nomFichier.
    parce que comme l'indique la doc, le constructeur de ifstream prend un const char*, ce qu'est "cle.txt" et non un std::string.

    Pour un tel exercice, j'opterais pour un std::map<char, char> et std::for_each, std::transform ou std::replace.
    Il y a aussi une autre méthode dont j'oublie toujours le nom qui permet de faire du push_back à la volée
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Hello,

    parce que comme l'indique la doc, le constructeur de ifstream prend un const char*, ce qu'est "cle.txt" et non un std::string.
    J'avais vu ça dans mes erreurs mais je comprenais pas qu'au final le "cle.txt" était de type const char*. Du coup, ce problème ce pallie par cette solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichier(nomFichier.c_str());

    Citation Envoyé par Bousk Voir le message
    Pour un tel exercice, j'opterais pour un std::map<char, char> et std::for_each, std::transform ou std::replace.
    Il y a aussi une autre méthode dont j'oublie toujours le nom qui permet de faire du push_back à la volée
    Je vais m'intéresser à la map puis je reviendrai si j'ai d'autres éventuelles questions, j'avais hésité à passer par là. Pour ce qui est des algorithmes, c'est bien ceux que j'avais en tête, notamment std::transform().

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Depuis la norme C++11 (5ans maintenant), ifstream peut prendre un std::string.

    @Bousk: emplace_back, également depuis C++11.

    @alexandrempg: Utiliser une boucle for pour le parcours d'itérateur est plus idiomatique qu'une boucle while et le risque d'oublier l'incrémentation y est moins fort. l'utilisation d'algorithme simplifie aussi pas mal (cf: std::copy + std::back_inserter), mais dans l'absolu, std::string peut s'initialiser avec 2 itérateurs, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string a{
      std::istreambuf_iterator<char>{fichier},
      std::istreambuf_iterator<char>{}
    };
    est beaucoup plus simple.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    @Bousk: emplace_back, également depuis C++11.
    Non, je parlais de back_inserter.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Par défaut
    Salut

    Je ne vois pas trop l'intérêt de lire le fichier avec un itérateur puisqu'il faut faire un traitement non homogène sur les données. Personnellement, j'aurais écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ifstream fichier("cle.txt");
    map<char,char> lut;
    char cle, valeur;
    while (fichier >> cle) { if (fichier >> valeur) lut[cle] = valeur; }
    Le map est effectivement une bonne idée (ne pas oublier de tester si le caractère est bien dans la map lors de la substitution...). Pour l'algorithme de substitution, je pense que for_each sera le plus simple et le plus efficace.

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Blowfish] Chiffrement par bloc
    Par b_reda31 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/07/2011, 17h27
  2. [Turbo Pascal] Chiffrement par décalage (chiffre de César)
    Par tessafadel10 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 14/06/2010, 22h43
  3. piratage par substitution de fichier .js
    Par mapmip dans le forum Sécurité
    Réponses: 7
    Dernier message: 25/11/2009, 10h10
  4. Suppression de caractères par substitution
    Par abirihabibi dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2008, 00h15

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