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 :

Algorithme de vigenere modifié


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1
    Par défaut Algorithme de vigenere modifié
    Bonjour
    Je suis novice en programmation c. Je souhaite, dans le cadre d'un travail de recherche à présenter, écrire un programme de chiffrement et de déchiffrement par la méthode de vigenère. le plus de mon algorithme est qu'il devra prendre en compte les caractères accentués, les chiffres les espaces ainsi que les ponctuations de la langue française (à,é,è,ê,ç, ù, 1, 2, 3, 4, 5, 6,7,8,9,0).
    j'ai pu écrire l’algorithme suivant mais je n'arrive pas a extraire le résultat du texte chiffré pour l'afficher a l’écran. ce résultat se trouve en principe dans cod[].

    Ci dessous l'algorithme.

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
    #include <wchar.h>
    void warning(void);
    void error(void);
    void vigenere (void);
    void chiffrement (void);
    void dechiffrement (void);
    wchar_t Alpha[] = {L"abcdefghijklmnopqrstuvwxyz@0123456789 ,;:!?.%c133%c130%c138%c136%c151%c135%c147%c131"};
    wchar_t Cle []={};
    wchar_t Acoder [1024], cod[1024];
    int i, t, u;
    int PosCle =0;
    wchar_t *PosLetCle; //pointeur sur la position de la lettre cle
    wchar_t *Pos; //Pointeur sur la position de la lettre dans la pgrase
    int NouvPos=0; //nouvelle position qui determinera la lettre correspondant au chiffrement
    //int choix, nombre;
    wchar_t LetCle; // la lettre dans la clé de chiffrement
    wchar_t Let, Lettre; //La lettre dans la phrae à coder
     
    	int main()
    	{
     
            wprintf (L"\n Veuillez saisir la phrase %c crypter:\n ", 133 );
            wscanf(L"%ls", Acoder);
            wprintf (L"\n Entrez la cle de codage de la phrase: \n" );
            wscanf(L"%ls", Cle);
            t = wcslen(Acoder);// longueur de la phrase saisie au clavier
            u = wcslen(Cle); //Longueur de la clé de chiffrement
     
                for (i=0; i<t ; i++)
                    {
                        PosCle= PosCle+1;
                        if (PosCle>u)
                        PosCle=1;
     
            /* on determine quelle est la lettre cle et sa position dans l'alphabet que nous avons définit en prenant en compte les caractère acceutué */
     
                        LetCle = Cle[PosCle];
                        PosLetCle = wcschr(Alpha, LetCle); //on renvoie un pointeur sur la première occurence de Letclé que l'on trouve dans Alpha equivaut a strchr en C
     
                        /* on determine la position de la lettre a coder et le decalage a appliquer */
                        Let = Acoder[i];
                        Pos = wcschr(Alpha, Let);
                        NouvPos = *Pos + *PosLetCle;
     
                        if (NouvPos > 52)
                        NouvPos = NouvPos - 52;
     
                        cod[i]= Alpha[NouvPos];
                    }
                    cod[i]= '\0';
     wprintf(L"la phrase codee est: %ls\n", cod);
     
    	}



    Mon algorithme est t'il correct ou existe t'il des modifications a y apporter? L'affichage du message chiffré ne se fait pas a l'écran.

    Je sollicite votre indulgence et espère avoir un retour
    Merci

  2. #2
    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
    Bonjour,

    Du point de vue du langage C, il y a quelques étourderies qui causent des bogues récurrents dans le programme. Premier problème, ligne 47, tu déréférences les pointeurs Pos et PosLetCle. De par leur durée de stockage statique, ils sont positionnés à la valeur nulle ; cela causera, sur une machine conventionnelle, une erreur de segmentation (ou équivalent) à l'exécution. D'autre part, en ne spécifiant aucune taille à Cle, tu vas sûrement engendrer un débordement mémoire en écrivant dedans avec scanf.

    Peut-être devrais-tu, dans un premier temps, ne pas te préoccuper des caractères accentués et poser un code fonctionnel et efficace, par exemple :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX_SIZE	64
     
    static void fflush_input_stream(FILE *fp)
    {
    	int c;
     
    	while ((c = getc(fp)) != '\n' && c != EOF)
    		;
    }
     
    static size_t get_string(const char *prompt, char *dst, size_t size)
    {
    	size_t nread = 0;
     
    	printf("%s", prompt);
    	fflush(stdout);
     
    	if (fgets(dst, size, stdin) != NULL) {
    		char *p = strchr(dst, '\n');
     
    		if (p != NULL)
    			*p = '\0';
    		else
    			fflush_input_stream(stdin);
     
    		nread = strlen(dst);
    	}
     
    	return nread;
    }
     
    int main(void)
    {
    	const char alpha[] = "abcdefghijklmnopqrstuvwxyz";
    	char key[MAX_SIZE];
    	char plain[MAX_SIZE];
    	size_t size_alpha = sizeof alpha / sizeof *alpha;
    	size_t size_key = get_string("Plaintext: ", plain, sizeof plain);
    	size_t size_plain = get_string("Key: ", key, sizeof key);
     
    	for (size_t i = 0, j = 0; i < size_plain; ++i, ++j) {
    		if (j == size_key)
    			j = 0;
     
    		char *p = strchr(alpha, plain[i]);
    		char *q = strchr(alpha, key[j]);
     
    		if (p != NULL && q != NULL)
    			printf("%c", alpha[(*p + *q) % size_alpha]);
    		else
    			printf("%c", plain[i]);
    	}
     
    	putchar('\n');
     
    	return EXIT_SUCCESS;
    }
    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

Discussions similaires

  1. Algorithme de Bellman modifié
    Par nicolas66 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 24/12/2010, 18h20
  2. Réponses: 17
    Dernier message: 10/12/2010, 09h07
  3. Modifier titre de l'algorithme
    Par fasfousba dans le forum Mathématiques - Sciences
    Réponses: 6
    Dernier message: 16/12/2009, 22h39
  4. Algorithme FCM modifié
    Par larimoise dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 16/04/2007, 23h12
  5. Réponses: 1
    Dernier message: 20/04/2005, 02h43

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