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 :

Programme (simple) cryptage XOR


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Programme (simple) cryptage XOR
    Bonjour à tous,

    J'ai un petit soucis car je n'ai encore jamais manipulé les chaînes de caractères, et les opérateurs bit à bit. Il faudrait donc que je fasse un programme qui me code une chaine de caractère avec le caractère ASCII d'ordre 199 (sur tous les caractères de mon texte).

    J'ai testé plusieurs choses, mais voici ma dernière version :

    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
     
    #include <stdio.h>
    #include <string.h>
     
    char* CrypteDecrypte(char* MonTexte)
    {
        int i;
        for(i=0;i<strlen(MonTexte);i++)
        {
            MonTexte[i]=(char)MonTexte[i]^'199';
        }
        return MonTexte;
    }
     
     
    void AfficherCrypt(char* Texte)
    {
        int i;
        for(i=0;i<strlen(Texte);i++)
        {
            printf("%c", Texte[i]);
        }
    }
    int main() {
        char* Texte="o"; //test avec la lettre o minuscule
        CrypteDecrypte(Texte);
        AfficherCrypt(Texte);
        return 0;
    Donc dans ma fonction, j'ai tenté de caster le MonTexte[i] afin qu'il soit du même type que '199', mais un message apparait et dit "Multi-character character constant".
    Après, comme je vous l'ai dit, je ne sais pas si j'utilise la bonne méthode pour accéder à tous les éléments de ma chaine de caractères, car je n'ai encore jamais travaillé sur ce genre de chose.
    De plus, dans l'énoncé, il est écrit que le corps de la fonction peut être fait en une seule ligne. Or là j'en ai plusieurs car j'utilise une boucle. Mais je ne sais pas ce qu'ils veulent dire par "corps", peut-être seulement l'instruction de changer chaque caractère avec un XOR ?

    Merci d'avance pour votre réponse.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Bonjour,

    Erreur très classique : dans une chaine, les indices vont de 0 à strlen-1.

    D'autre part, attention : utiliser XOR peut conduire à remplacer un caractère valide par un 0 (zéro), ce qui posera un problème lorsque tu voudras décoder, le système voyant désormais une chaine de longueur inférieure à celle d'origine.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Bonjour,

    Oui effectivement, je m'étais posé la question, et puis comme je n'avais pas vu d'erreurs, j'avais finalement laissé de 1 à strlen.

    Par exemple si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        1011 1111
    XOR 1111 1111
    on obtient : 0100 0000 et je vais perdre le zéro le plus à gauche, soit 100 0000 ?

    Mais du coup, est-ce qu'il faut faire une boucle "pour" si je veux accéder à chaque caractère de ma chaine ? Et comment puis-je corriger ma ligne qui pose problème : Texte[i]=(char)Texte[i]^'199'; ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 38
    Par défaut
    Bon sur téléphone je ne peux pas éditer de message sans le supprimer.

    Utilise 199 au lieu de '199' car ce dernier est un nombre de 3 octets dont la représentation ASCII correspond au 3 caractères '1', '9' et '9'.

    Le problème du XOR n'est pas le 0 initial mais quand le résultat du XOR vaut 0. Cela correspond à un caractère de fin de chaîne. Donc ta chaîne cryptée paraitra avoir moins de caractère que ta chaîne d'origine.

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    J'ai changé ma ligne et j'ai mis Texte[i]=(char)Texte[i]^199; . J'ai aussi essayé avec Texte[i]=(int)Texte[i]^199; mais les deux ne marchent pas. Enfin, je ne sais pas si c'est une bonne chose de forcer le type comme je tente de faire.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par Stéphanois57 Voir le message
    J'ai changé ma ligne et j'ai mis Texte[i]=(char)Texte[i]^199; . J'ai aussi essayé avec Texte[i]=(int)Texte[i]^199; mais les deux ne marchent pas. Enfin, je ne sais pas si c'est une bonne chose de forcer le type comme je tente de faire.
    Qu'est-ce qui te fait dire que cela ne marche pas?
    Les deux cast que tu fais sont inutiles, mais la fonction crypte bien avec le caractère de code ASCII 199.
    Attention, comme il te l'a été dis, les caractères cryptés risquent de ne plus être affichables, et en particulier ne pas tenter de crypter le caractère de code 199 car celui-ci se transformerait en terminateur.
    En une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(size_t i=0;i<strlen(MonTexte);i++) MonTexte[i] ^= (char)199;

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

Discussions similaires

  1. Quel langage de programmation pour des programmes simples ?
    Par Pierre.g dans le forum Langages de programmation
    Réponses: 18
    Dernier message: 22/11/2006, 14h22
  2. Programme "simple" devient très lent ?
    Par Invité dans le forum Delphi
    Réponses: 8
    Dernier message: 18/09/2006, 22h32
  3. Création de programme simple
    Par mz-hacker dans le forum Windows
    Réponses: 1
    Dernier message: 06/08/2006, 00h34
  4. programme de cryptage
    Par hamadibensassi dans le forum C
    Réponses: 14
    Dernier message: 01/06/2006, 20h30
  5. [delphi 7 perso] Cryptage XOR et assembleur
    Par Loran dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2005, 10h44

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