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 :

implementation de l'algorithme RC4.c


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Par défaut implementation de l'algorithme RC4.c
    bonsoir ,

    je vient de trouver ce code mais en faisant l’exécution la fenêtre noir se ferme automatiquement


    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    /*
     * rc4.c - written for readability
     *
     * http://blog.markloiseau.com/2012/07/rc4-tutorial/
     */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef unsigned char u_char;
     
    // Output level, from 0 to 3
    #define OUTPUT 2
     
    // Function prototypes
    void initialize(u_char *State);
    void swap(u_char *a, u_char *b);
    void ksa(u_char *State, u_char *key);
    u_char * prng(u_char *State, int msglength);
    void rc4(u_char *key, u_char *input, u_char *output);
     
    int main(int argc, char *argv[]) {
      u_char key[256];		// The encryption/decryption key
      u_char input[256];		// The input data
      u_char output[256];		// The output
     
      strncpy((char *) key, "Secret", 256);
      strncpy((char *) input, "Attack at dawn", 256);
     
      // encrypt
      rc4(key, input, output);
     
    #if OUTPUT >= 1
      int i = 0;
      printf("\n\n--- Encryption ---");
      printf("\nOutput:\n");
      for(i=0; i<strlen((char *) input); i++) {
        if(output[i]<16)
          printf("0%x ", output[i]);
        else
          printf("%x ", output[i]);
      }
      printf("\n");
    #endif
     
      // decrypt
      rc4(key, output, input);
     
    #if OUTPUT >= 1
      printf("\n\n--- Decryption ---");
      printf("\nOutput:\n");
      printf("%s\n", input);
    #endif
     
      exit(0);
    }
     
    /*
     * RC4 functions
     */
     
    /* Initialize State[256] to the identity permutation. */
    void initialize(u_char *State) {
      int i;
     
      for(i=0; i<256; i++) {
        State[i] = i;
      }
    #if OUTPUT == 3
      printf("Initialized State[]:\n");
      for(i=0; i<16; i++)
        printf(" 0%x ", State[i]);
      printf("\n");
      for(i=1; i<16; i++) {
        for(j=0; j<16; j++)
          printf(" %x ", State[16*i+j]);
        printf("\n");
      }
    #endif
      return;
    }
     
    /* Swap array elements i=State[i] and b=State[j]. */
    void swap(u_char *i, u_char *j) {
      u_char temp;
     
      temp = *i;
      *i = *j;
      *j = temp;
    }
     
    /* Key scheduling algorithm. Swap array elements based on the key. */
    void ksa(u_char *State, u_char *key) {
      int byte, i, keylen, j=0;
     
      keylen = (int) strlen((char *) key);
     
      for(i=0; i<256; i++) {
        j = (j + State[i] + key[i%keylen]) % 256;
        swap(&State[i], &State[j]);
      }
     
    #if OUTPUT >= 2
      printf("Key scheduled State[]:\n");
     
      for(i=0; i<16; i++) {
        for(j=0; j<16; j++) {
          byte = State[16*i+j];
          if(byte<16)
    	printf(" 0%x ", byte);
          else
    	printf(" %x ", byte);
        }
        printf("\n");
      }
    #endif
      return;
    }
     
    /* Pseudo-random number generator: Generate the keystream. */
    u_char * prng(u_char *State, int msglength) {
      int i=0, j=0, k;
     
      u_char *keystream;
     
      keystream = (u_char *)malloc(sizeof(u_char)*msglength);
     
      for(k=0; k<msglength; k++) {
        i = (i+1) % 256;
        j = (j+State[i]) % 256;
     
        swap(&State[i], &State[j]);
     
        keystream[k] = State[(State[i]+State[j]) % 256];
      }
      return keystream;
    }
     
    /* Encrypt or Decrypt */
    void rc4(u_char *key, u_char *input, u_char *output) {
      int i;
      u_char State[256];
      u_char *keystream;
     
      initialize(State);
     
      ksa(State, key);
     
      keystream = prng(State, strlen((char *) input));
     
      for(i=0; i<strlen((char *) input); i++)
        output[i] = input[i] ^ keystream[i];
     
    #if OUTPUT >= 1
      printf("\n--- Key Generation ---\nKey: %s\n", key);
      printf("Keystream:\n");
      for(i=0; i<strlen((char *) input); i++) {
        if(keystream[i]<16)
          printf("0%x ", keystream[i]);
        else
          printf("%x ", keystream[i]);
      }
    #endif
    return 0;
    }

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ca parait normal : le exit(0) à la fin de la fonction main (qui devrait d'ailleurs, en outre, etre un return 0; ) fait quitter le programme et il n'y a aucune instruction qui fasse en sorte d'arrêter l'exécution pour que l'utilisateur puisse lire le résultat
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Ca parait normal : le exit(0) à la fin de la fonction main (qui devrait d'ailleurs, en outre, etre un return 0; ) fait quitter le programme et il n'y a aucune instruction qui fasse en sorte d'arrêter l'exécution pour que l'utilisateur puisse lire le résultat
    je viens de changer exit(0) par return 0; mais c'est le même problème

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mais ca, c'est aussi normal...

    Je te faisais juste remarquer que la fin de la fonction main, ce n'est pas un exit(0), mais que c'est un return 0 pour indiquer au système d'exploitation que le programme s'est correctement terminé

    C'était juste la correction d'une erreur qui n'avait aucunement le but de corriger ton problème

    Mais c'était une réponse en deux parties, et tu as zappé la partie la plus intéressante, à savoir:
    et il n'y a aucune instruction qui fasse en sorte d'arrêter l'exécution pour que l'utilisateur puisse lire le résultat
    par laquelle je t'ai indiqué la cause de ton problème, à savoir le fait que tu n'as rien fait pour demander que l'exécution du programme s'interrompe le temps que tu lises le résultat.

    Autrement dit : il faut que tu fasses en sorte que le programme fasse une pause une fois qu'il a affiché le résultat

    Je t'ai donc, maintenant, clairement expliqué ce que tu devais faire, à toi de voir comment tu dois le faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre actif
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Par défaut
    j'ai ajouté fgetc(stdin) à la fin de programme,
    j'ai pu voir la fenêtre d’exécution

  6. #6
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Je te faisais juste remarquer que la fin de la fonction main, ce n'est pas un exit(0), mais que c'est un return 0 pour indiquer au système d'exploitation que le programme s'est correctement terminé
    Pas vraiment ; il n'y a qu'à voir le comportement de GNU sur la question. Dans la pratique, il n'y a pas vraiment de différence : que tu fasses un exit ou un return, dans les deux cas, « tu indiqueras au système d'exploitation que le programme s'est correctement terminé », pour reprendre tes mots. Évidemment, l'utilisation de return est considéré comme du bon style tout plein ; en plus ça fait taire certains compilateurs bavards, qui râlent pour des faux positifs, en l'occurrence. La norme précise un valeur de retour indéfinie quand le } est atteint (et encore, en C89) ; or, avec un exit(0), ça ne sera pas plus le cas qu'avec un return.

    Citation Envoyé par C11 (n1570), § 5.1.2.3 Program execution
    If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    Pas vraiment ; il n'y a qu'à voir le comportement de GNU sur la question. Dans la pratique, il n'y a pas vraiment de différence : que tu fasses un exit ou un return, dans les deux cas, « tu indiqueras au système d'exploitation que le programme s'est correctement terminé », pour reprendre tes mots. Évidemment, l'utilisation de return est considéré comme du bon style tout plein ; en plus ça fait taire certains compilateurs bavards, qui râlent pour des faux positifs, en l'occurrence. La norme précise un valeur de retour indéfinie quand le } est atteint (et encore, en C89) ; or, avec un exit(0), ça ne sera pas plus le cas qu'avec un return.
    Je vais peut-être dire une bêtise mais il me semble qu'avec atexit, on peut donner une fonction à exécuter lors du exit() qui ne sera donc pas exécutée lors du return (?).
    Ainsi en cas d'erreur, on fait un exit() qui appelle la fonction et qui ferme le programme proprement. Mais en cas de terminaison normale du programme, on ne fait qu'un return.

  8. #8
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Je vais peut-être dire une bêtise mais il me semble qu'avec atexit, on peut donner une fonction à exécuter lors du exit() qui ne sera donc pas exécutée lors du return (?).
    Ainsi en cas d'erreur, on fait un exit() qui appelle la fonction et qui ferme le programme proprement. Mais en cas de terminaison normale du programme, on ne fait qu'un return.
    Pour le coup, il n'y a pas non plus de différence entre exit et return ; dans les deux cas, la fonction enregistrée sera exécutée en cas de terminaison normale.

    Citation Envoyé par C11 (n1570), § 7.22.4.2 The atexit function
    The atexit function registers the function pointed to by func, to be called without arguments at normal program termination.
    Citation Envoyé par C11 (n1570), 7.22.4.4 The exit function
    The exit function causes normal program termination to occur.
    Citation Envoyé par C11 (n1570), § 5.1.2.2.3 Program termination
    If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument [...].
    En revanche, ce n'est pas le cas de la fonction _Exit (C11).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    Pas vraiment ; il n'y a qu'à voir le comportement de GNU sur la question. Dans la pratique, il n'y a pas vraiment de différence : que tu fasses un exit ou un return, dans les deux cas, « tu indiqueras au système d'exploitation que le programme s'est correctement terminé », pour reprendre tes mots. Évidemment, l'utilisation de return est considéré comme du bon style tout plein ; en plus ça fait taire certains compilateurs bavards, qui râlent pour des faux positifs, en l'occurrence. La norme précise un valeur de retour indéfinie quand le } est atteint (et encore, en C89) ; or, avec un exit(0), ça ne sera pas plus le cas qu'avec un return.
    Ah, ben, au temps pour moi

    Mais bon, si ca peut faire taire certains compilateur bavards...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Salut, pour en revenir à la question, j'imagine que tu tournes sous windows (une console qui disparaît.. généralement c'est qu'elle n'est là que pour l'exécution du programme et qu'on est pas sous unix avec un terminal qu'on laisse ouvert comme à son habitude...). (Mais ça reste qu'une supposition)


    Donc je te propose aussi comme solution de mettre :
    juste avant le return 0;

    En tout cas c'est juste pour proposer une alternative à fgetc(stdin)

    Sinon pour les atexit() on_exit(), exit(), _exit(), __attribute__ ((destructor))... tout ce que ça fait au final c'est modifier la section DTOR ou ajouter des adresses entre __DTOR_LIST__ et __DTOR_END__, donc ajouter des fonctions à exécuter à la terminaison du programme. Du coup je vois pas trop comment ça peut résoudre le problème (ni même le poser d'ailleur) à moins de placer l'adresse du main dedans et là j'ai jamais essayé mais je pense que le programme s'arrêtera quand même.. et pas en retournant un code de terminaison normal

    A noter que le system("PAUSE") peut dans certain cas être déconseillé, donc => "ne reste qu'une alternative", mais c'est bon de la connaître

  11. #11
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    dans un premier temps on pourrait même utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("<enter> pour continuer ");                                                             
    scanf("%*c");
    Deux lignes pas compliquées à comprendre et qui s'expliquent rapidement en attendant que celui qui en a besoin en perçoive les limites.
    Mais c'est vrai que c'est pas évident pour un novice de comprendre pourquoi la "fenêtre noire" disparaît alors que tout se passe dans un IDE ...

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Pop360 Voir le message
    Salut, pour en revenir à la question, j'imagine que tu tournes sous windows (une console qui disparaît.. généralement c'est qu'elle n'est là que pour l'exécution du programme et qu'on est pas sous unix avec un terminal qu'on laisse ouvert comme à son habitude...). (Mais ça reste qu'une supposition)


    Donc je te propose aussi comme solution de mettre :
    juste avant le return 0;
    Honnêtement, je ne suis pas particulièrement partisant de l'utilisation de system, "simplement" parce que l'on n'est jamais sur de la portabilité des appels qu'elle permet

    Il ne faut pas oublier, de plus, que les appels systèmes sont particulièrement couteux en temps d'exécution et que, même si cela n'aura sans doute pas d'influence ici, cela peut en avoir une énorme dans d'autres circonstances
    A noter que le system("PAUSE") peut dans certain cas être déconseillé, donc => "ne reste qu'une alternative", mais c'est bon de la connaître
    A ce moment là, je préférerais encore conseiller de lancer une invite de commande (menu démarrer->tous les programmes->accessoires -> invite de commandes) et d'aller dans le dossier dans lequel le projet a été compilé, avant d'invoquer "a mano" le nom de l'exécutable

    Il faut aussi noter que de nombreux EDI permettent d'indiquer dans les options du projet si l'on souhaite une pause à la fin de l'exécution du programme, et que c'est souvent suffisant pour de simples essais
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Compréhension de l'algorithme RC4
    Par Titer22 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 06/12/2014, 11h55
  2. Microsoft lance un appel à l'abandon définitif de l'algorithme RC4
    Par Cedric Chevalier dans le forum Actualités
    Réponses: 2
    Dernier message: 17/11/2013, 22h16
  3. Réponses: 1
    Dernier message: 28/09/2011, 13h35
  4. Réponses: 0
    Dernier message: 27/09/2011, 18h07
  5. implementation de l'algorithme Roy-Warshall-Floyd
    Par adilou1981 dans le forum Général Java
    Réponses: 0
    Dernier message: 30/07/2009, 11h50

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