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 :

Cryptographie chiffrement par bloc ECB


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Cryptographie chiffrement par bloc ECB
    Bonjour
    svp j'ai besoin d'aide
    voila mon programme, mais je sais pas si c'est juste ou non parce que je n'ai pas pu l’exécuter

    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
       #include <cstdlib>
    #include <iostream>
    #include <conio.h>
     
    using namespace std;
     
    int main()
    {int i,j,Ncl,Nme,k[50];
    int m[100],c[100];
     
    printf("donner la taille de mesage a cripter=");
    scanf("%i",&Nme);
    printf("\n");
    printf("donner la taille de la cle a cripter=");
    scanf("%i",&Ncl);
    printf("donner le message a crypte \n");
    for (i=0;i<Nme;i++){
      scanf("%i",&m[i]); }
      printf("\n");
       printf("donner la cle \n");
    for (i=0;i<Ncl;i++){
      scanf("%i",&k[i]); }
     
    for (i=0;i<Nme;i=i+Ncl){
        for(j=0;j<Ncl;j++){
        c[i+j]=m[i+k[j]-1];}}
          printf("le message est \n");
    for (i=0;i<Nme;i++){
      printf("%i",c[i]); }
     
    getch();
    }
    ps: chaque fois il m'affiche des erreurs à la ligne 11 et 12
    printf("donner la taille de mesage a cripter=");
    scanf("%i",&Nme);

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Alors déjà :

    Réindente et écrit clairement !

    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
    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
     
    using namespace std;
     
    int main()
    {
      int i, j, Ncl, Nme, k[50];
      int m[100], c[100];
     
      printf("donner la taille de mesage a cripter=");
      scanf("%i",&Nme);
      printf("\n");
      printf("donner la taille de la cle a cripter=");
      scanf("%i",&Ncl);
      printf("donner le message a crypte \n");
     
      for (i=0;i<Nme;i++)
      {
        scanf("%i",&m[i]);
      }
      printf("\n");
      printf("donner la cle \n");
      for (i=0;i<Ncl;i++)
      {
        scanf("%i",&k[i]);
      }
     
      for (i=0;i<Nme;i=i+Ncl)
      {
        for(j=0;j<Ncl;j++)
        {
          c[i+j]=m[i+k[j]-1];
        }
      }
      printf("le message est \n");
     
      for (i=0;i<Nme;i++)
      {
        printf("%i",c[i]);
      }
     
      getch();
    }
    Ensuite : tu fais du C, donc pas de namespace...
    Ni de cstdlib ou iostream !

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
     
    int main()
    {
      int i, j, Ncl, Nme, k[50];
      int m[100], c[100];
     
      printf("donner la taille de mesage a cripter=");
      scanf("%i",&Nme);
      printf("\n");
      printf("donner la taille de la cle a cripter=");
      scanf("%i",&Ncl);
      printf("donner le message a crypte \n");
     
      for (i=0;i<Nme;i++)
      {
        scanf("%i",&m[i]);
      }
      printf("\n");
      printf("donner la cle \n");
      for (i=0;i<Ncl;i++)
      {
        scanf("%i",&k[i]);
      }
     
      for (i=0;i<Nme;i=i+Ncl)
      {
        for(j=0;j<Ncl;j++)
        {
          c[i+j]=m[i+k[j]-1];
        }
      }
      printf("le message est \n");
     
      for (i=0;i<Nme;i++)
      {
        printf("%i",c[i]);
      }
     
      getch();
    }

    Pas d'arguments par le main : on lui met des void !

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
     
    int main(void)
    {
      int i, j, Ncl, Nme, k[50];
      int m[100], c[100];
     
      printf("donner la taille de mesage a cripter=");
      scanf("%i",&Nme);
      printf("\n");
      printf("donner la taille de la cle a cripter=");
      scanf("%i",&Ncl);
      printf("donner le message a crypte \n");
     
      for (i = 0; i < Nme; i++)
      {
        scanf("%i",&m[i]);
      }
      printf("\n");
      printf("donner la cle \n");
      for (i = 0; i < Ncl; i++)
      {
        scanf("%i",&k[i]);
      }
     
      for (i = 0; i < Nme; i = i + Ncl)
      {
        for(j = 0; j < Ncl; j++)
        {
          c[i + j] = m[i + k[j] - 1];
        }
      }
      printf("le message est \n");
     
      for (i = 0; i < Nme;i ++)
      {
        printf("%i",c[i]);
      }
     
      getch();
    }
    Maintenant recompile pour voir... et donner la bonne ligne d'erreur !
    Tu utilises visual studio pour compiler ? (conio...)

    Sinon, "cripter", n'existe pas...
    Déjà que "crypter" est l'anglicisme de "chiffrer", je pense que ton prof qui verra "cripter" pètera un câble.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Points : 204
    Points
    204
    Par défaut
    Ne soit pas trop dur avec lui, j'ai été à la faculté et en apprentissage du langage c'est pas la joie.

    et si ce n'est que des include et un namespace (qui oui sont en C++)
    mais que le code , lui est assimilable à un code écrit en C c'est ce qui compte non ?

    alors pour le code...

    voila mon programme, mais je sais pas si c'est juste ou non parce que je n'ai pas pu l’exécuter
    Si tu n'arrives pas à l’exécuter alors il n'est pas bon(enfin ça me semble logique).

    'erreur semble venir du fait que tu as oublié d'inclure <stdio.h> (contient printf et scanf entre autre)

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Le namespace est "uniquement" C++, pareil pour les includes sans .h....
    Certes VS va compiler ça, car "par défaut" c'est le compilo C++ qui est appelé (donc beaucoup plus "gentil")...
    Mais que tu sois en fac ou pas, personnellement j'avais très peur en 2008 quand VS m'ajoutait des tas d'includes que je ne connaissais pas, ou des mots clés jamais vus... mon premier réflexe était de les enlever et de faire fonctionner un "hello world" simple.


    ...mais je ne suis pas plus méchant que ça...
    Quand on me dit "ça ne marche pas", personne ne peut aider si tu ne donnes pas les symptômes/erreurs & warnings que le compilo renvoie/erreurs que le programme renvoie à l'exécution !


    Et c'est suffisamment mal écrit pour "quand même" râler... (cripter, crypte, doner, ...)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre actif
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 70
    Points : 204
    Points
    204
    Par défaut
    Alors pour faire un chiffrement ECB. (pour 2 personnes )
    Il vous faut

    une fonction pour chiffrer un bloc
    (tu peux modifier la fonction si tu souhaite rajouter.. par exemple une clef de chiffrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void chiffrerBloc(char* bloc,int tailleBloc)
    {
     int i;
     //mettre ici le code pour chiffrer un bloc
     //j'ai simplement choisi d'inverser les bits
     for(int i=0;i<taillebloc;i++)
      bloc[i]=~bloc[i];//et j'ai choisit le plus mauvais :p
    }
    une fonction pour obtenir le prochain bloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char* blocSuivant(char* debut,int tailleBlocMax)
    {
     int i;
     for(i=0;tailleBlocMax--&&debut[i]!='\0';i++);//on vérifie qu'on arrive pas à la fin du message
     //soit on arrive à la fin de la chaine soit on a réussit à lire caractère du message mais dans tout les cas on renvoie l'adresse 
     return debut+i;
    }
    //taille du bloc lu sera le début-retour de la fonction
    Une fonction pour tout chiffrer tout le message
    (adapter les paramètres de la fonctionselon les besoins)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chiffrer_ECB(char* m,int tailleBlocMax)
    {
     char* bloc_suiv;//adresse du bloc suivant
     while(*m!='\0')//tant que le message n'est pas totalement lu
     {
      bloc_suiv=blocSuivant(m,tailleBlocMax);
      chiffrerBloc(m,(int)(bloc_suiv-m));//(int)(bloc_suiv-m) = m+i-m = i = nombre de caractères lu
      m=bloc_suiv;
     }
    }
    Ici (même si j'ai codé directement sans vérfication aucune ) j'ai découpé le travail en fonction.

    Du coup, il est plus simple de savoir d'où provient une erreur.
    et de la corriger...
    et si j'ai besoin que quelqu'un qui n'a jammais lu mon code et qui ne sait pas forcement ce qu'est un bloc ECB puisse m'aider , il sera plus simple pour cette personne de te relire juste avec des noms de variables clairs et des fonction clairs

    sans oublier la chose la pus appréciée : les commentaires

    ça à l'air de rien mais sur un projet plus conséquent tout ces petits détails feront gagner un temps non négligeable.


    N.B
    coder en VS me donne des boutons

    et je suis d'accord avec toi metalman

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour
    je vous remercie infiniment pour vos conseils, ça marche très très bien avec le code ECB
    et j'ai commencé a faire les codes FCB et CBC , j'ai suivi vos conseils mais je sais pas ou je me suis trompé
    il y a toujours des problèmes dans mes programmes

    voila pour le code CBC

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
     
    int main(void)
    {
    int i,j,Ncl,Nme,l,k[50];
    int m[100],c[50],v[100];
     
    printf("donner la taille du message a crypter=");
    scanf("%i",&Nme);
     
    printf("\n");
     
    printf("donner la taille de la cle a crypter=");
    scanf("%i",&Ncl);
     
    printf("donner le message a crypte \n");
    for (i=0;i<Nme;i++){
      scanf("%i",&m[i]); }
     
    printf("\n");
     
       printf("donner la cle \n");
    for (i=0;i<Ncl;i++){
      scanf("%i",&k[i]); }
     
      printf("donner landa c0=");
      for (i=0;i<Ncl;i++){
        scanf("%i",&v[i]);  
       }
     
    for (i=0;i<Nme;i=i+Ncl){
        for(j=0;j<Ncl;j++){
         if(j==0){ for(l=0;l<Ncl;l++){m[i+l]=m[i+l]xor(v[l]);}}                 
        c[i+j]=m[i+k[j]-1];
        v[j]=c[i+j];}}
     
    printf("le message est \n");
    for (i=0;i<Nme;i++){
     
    printf("%i",c[i]); }
     
    getch();
    }

    et voila le code fcb

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
     
    int main(void)
    {
    int r,i,j,Ncl,Nme,o[50],w,k[50],m[100],c[100],v[100];
     
    printf("donner la taille de message a crypter=");
    scanf("%i",&Nme);
     
    printf("\n");
     
    printf("donner la taille de la clé=");
    scanf("%i",&Ncl);
     
    printf("donner le message a crypter \n");
    for (i=0;i<Nme;i++){
      scanf("%i",&m[i]); }
     
    printf("\n");
     
    printf("donner la cle \n");
    for (i=0;i<Ncl;i++){
    scanf("%i",&k[i]); }
     
    printf("donner la taille de r =");
    scanf("%i",&r);
     
    printf("\n");
     
    printf("donner landa c0=\n");
    for (i=0;i<Ncl;i++){
    scanf("%i",&v[i]);}
     
       for (i=0;i<Nme;i=i+Ncl){
         if (i!=0){
     
    for(j=0;j<Ncl;j++){
    o[i+j]=v[i+k[j]-1];}
     
    for (w=Ncl-r-2;w<Ncl;w++){
    c[i+j]=o[w]xor(m[i+j]);}
    }
    }
     
    printf("le message est \n");
    for (i=0;i<Nme;i++){
    printf("%i",c[i]); }
     
    getch();
    }
    aidez moi svp et merci d'avance

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je pense que si tu fais un effort, tu réussiras à faire encore moins compréhensible que ton code actuel. Il faudra de l'application quand même, pour battre la surabondance de variables "lettre" et l'absence totale et complète de commentaires...
    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.

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

Discussions similaires

  1. [AC-2010] Chiffrement par blocs pas compatible avec le verrouillage des lignes
    Par Daejung dans le forum Sécurité
    Réponses: 7
    Dernier message: 18/02/2015, 22h45
  2. [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
  3. Réponses: 9
    Dernier message: 21/11/2006, 11h16
  4. Lecture de fichier par blocs
    Par nicolas66 dans le forum C++
    Réponses: 12
    Dernier message: 11/11/2006, 20h36
  5. lecture par blocs dans un fichier avec marqueur
    Par cheikh_tk dans le forum C
    Réponses: 3
    Dernier message: 06/06/2006, 16h39

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