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 :

Problème sur codage XOR.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut Problème sur codage XOR.
    Bonjour à tous.

    Ayant pour but de m’entraîner à manipuler du code C++, je suis tombé sur ceci :

    http://www.primenumbers.net/Renaud/fr/crypto/XOR.htm

    J'ai donc voulu essaye d'appliquer cette méthode de codage de texte sur un fichier, ce qui m'à mené à pondre ce petit programme dont voici le code :

    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
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    int main()
    {
    	ifstream file("fichier.txt" , ios::in|ios::binary);
    	string key = "nimp";
    	char texteOrigin, texteConv[10];
     
    	for (int i(0), j(0); i < 10;i++, j++)
    	{
     
    		file.read((char *)&texteOrigin, sizeof(char));
    		if (j > key.size())
    		{
    			j = 0;
    		}
     
    		texteConv[i] = texteOrigin ^ key[j];
    	}
     
    	file.close();
    	cout << texteConv << endl;
    	ofstream fileenc("fichier.txt", ios::out|ios::trunc);
    	fileenc << texteConv;
    	system("pause");
    	return 0;
    }
    J'aimerais avoir votre avis sur ce code, car je me retrouve avec un petit problème lors du décodage.

    à savoir : pour tester ce petit programme, j'ai créé un fichier nommé "fichier.txt".
    Ce fichier contient simplement cette ligne : "azertyuiop".

    Le codage ce passe bien (je pense).
    Mais le décodage... Aie :

    Je me retrouve bien avec mes 10 caractères "azertyuiop" en début de mon fichier "fichier.txt", mais ils sont suivit de caractères assez "bizarres", je ne sais pas si c'est pas les caractères résultant du codage précédent.

    En mode pas à pas, ma variable texteConv contient bien RIEN-QUE mes caractères "azertyuiop" lorsque je demande au programme de me l'enregistrer dans le fichier txt (ligne d'instruction N°28).

    donc je ne comprends pas trop ce qu'il ce passe.

    ps:
    Texte dans fichier.txt non codé : "azertyuiop"
    Texte dans fichier.txt codé : "tpÌÌÌÌÌÌÌÌÌÌÌÌÌpÌÌÌÌÌÌÌÌ"
    Texte dans fichier.txt décodé : "azertyuiopÌÌÌÌÌÌÌÌÌÌÌÌÌpÌÌÌÌÌÌÌÌà"2nimp"
    (sans les " aux extrémités).

    Merci !

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    texteConv n’est pas terminé par un '\0'. Donc tu ne peux pas l’envoyer tel quel à travers un flux. Tu peux utiliser « write ».

    Plutôt que « read », tu peux utiliser « get » pour lire un caractère à la fois.

    Et sinon, plutôt que d’utiliser des char* ou des char[], utilise des std::vector<char> (ou std::array<char, 10>), cela t’évitera des erreurs. char* est à réserver pour les chaînes terminées par des '\0', quand utiliser std::string n’est pas possible.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut
    Merci pour votre réponse.

    J'ai suivis vos conseils et ai modifié mon code.
    Il est à présent comme ceci :

    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
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
     
    using namespace std;
     
    int main()
    {
    	ifstream file("fichier.txt" , ios::in|ios::binary);
    	string key = "nimp";
    	vector <char>  texteConv;
    	char texteOrigin;
     
    	for (int i(0), j(0); i < 10;i++, j++)
    	{
    		file.get(texteOrigin);
    		if (j > key.size())
    		{
    			j = 0;
    		}
     
    		texteConv.push_back(texteOrigin ^ key[j]);	
    		cout << texteConv[i];
    	}
     
    	cout << endl;
     
    	file.close();
     
    	ofstream fileenc("fichier.txt", ios::out|ios::trunc);
    	for (int i(0); i < texteConv.size(); i++)
    	{
    		fileenc.write(&texteConv[i],texteConv.size());
    	}
     
    	system("pause");
    	return 0;
    }
    à présent, dans mon fichier décodé je me retrouve avec ceci :

    "azertyuiopzertyuiopÍertyuiopÍÍrtyuiopÍÍÍtyuiopÍÍÍýyuiopÍÍÍýýuiopÍÍÍýýýiopÍÍÍýýýýopÍÍÍýýýýŸpÍÍÍýýýýŸó", au lieu de "azertyuiop" à l'origine.

    Bien que sur la console, mon résultat qui s'affiche est bien "azertyuiop"...

    Je pense que mon erreur viens de la dernière boucle for (ligne 32 à 35), j'ai pensé à le modifier comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i(0); i < texteConv.size(); i++)
    {
    	fileenc.write(&texteConv[i],i);
    }
    pour écrire caractère par caractère et non 10 fois 10 caractères (ce qui était illogique dans le code), mais ça ne fonctionne pas non plus...

    J'ai aussi essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i(0); i < texteConv.size(); i++)
    {
    	fileenc.put(texteConv[i]);
    }
    Mais c'est pas non plus approprié apparemment.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est pourtant bien la dernière solution qui est la bonne...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    L'erreur vient de là : fileenc.write(&texteConv[i],texteConv.size());. D'un côté tu demandes d'écrire un caractère à la fois et de l'autre tu lui demandes d'écrire toutes les données d'un coup. Prends quelques minutes pour lire et comprendre la documentation de std::ostream::write() et celle de std::vector::data et tu sauras quoi écrire .

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    D'un côté tu demandes d'écrire un caractère à la fois et de l'autre tu lui demandes d'écrire toutes les données d'un coup.
    Voilà pourquoi j'ai fini par écrire : fileenc.write(&texteConv[i],i); (que j'ai écris dans le post précédent). Mais ça fonctionne toujours pas ! où alors quelque chose m'échappe !

  7. #7
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    RTFM !
    1. Que prend en second argument la méthode std::basic_ostream::write ?
    2. Qu'est i ?
    3. Est-ce la même chose ?

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

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  3. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  4. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17
  5. [Accents - XML] Problème de codage non supporté !!
    Par Smortex dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/11/2002, 11h00

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