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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

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