Crypter-decrypter en utilisant l'algorithme de cesar

Soyez le premier à donner votre avis sur cette source.

Vue 17 499 fois - Téléchargée 1 768 fois

Description

Bonjour a tous

Voici ma première source ;)
Elle permet de crypter un texte en utilisant l'algorithme de Cesar (déballage de n lettres sur tout le texte), n peut etre choisi par l'utilisateur ;)
Elle permet aussi de décrypter un texte crypter selon cette méthode

Le texte a crypter ou a décrypter doit être présent dans un fichier nommé readme.txt a la racine de la source compilée ;)
Lors du cryptage et du décryptage, le texte original est gardé

Pour le decryptage, toutes les possibilités (n=1 >> n=26) sont écrites dans le fichier readme.txt

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
 
#define TAILLE_MAX 500
 
void clean_stdin (void);
void pause (int); 

char *openfichier()
{
	static char str[2000] = "";
 
	FILE* fichier = NULL;
	char chaine[TAILLE_MAX] = "";
 
    fichier = fopen("readme.txt", "r");	
 
	if (fichier != NULL)
	{
		printf ("\n---== Texte a crypter ==---\n\n\n");
		while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
        {
			strcat(str, chaine);
            printf("%s", chaine); 
	    }
		printf ("\n\n\n---== Texte a crypter ==---");
        fclose(fichier); 
	}
	else
	{
		system("cls");
		printf("\n\nImpossible d'ouvrir le fichier readme.txt\n\n");
		pause (1);
		exit(EXIT_FAILURE);
	} 
	return str;
	
}

 
void cesar_crypt (int decallage, char *texte)
{
	char c;
	int decMin = decallage - 'a';
	decallage -= 'A';
	while(c = *texte) 
	{
		if(c > 'z') goto nextCHR;
		if(c < 'A') goto nextCHR;
		if(c <= 'Z') goto goMAJ;
		if(c < 'a') goto nextCHR;
		c = 'a' + (c + decMin) % 26;
		goto goREPLACE;
        goMAJ:
		c = 'A' + (c + decallage) % 26;
        goREPLACE: *texte = c;
        nextCHR: texte++;
  } 
}

int main(int argc, char *argv[])
{
	int menu = 0;

	printf("\n==== Menu ====\n\n\n");
	printf("1. Cryptage\n\n");
	printf("2. Decryptage\n\n");
	printf("3. Quitter\n\n\n");
	scanf("%d", &menu);

	printf("\n");	

	if (menu == 1)
	{
		int decalage;
		int crypter = 0;
		
		FILE* fichier = NULL;	
		
		char *texte;
		texte = openfichier();	
		
		system("cls");
		printf ("\n\nUtiliser un decallage de combien de lettres pour crypter ce fichier ?\n\n");
		scanf  ("%d", &decalage);
		
		printf ("\n\nVoulez-vous vraiment crypter ce texte en utilisant un decalage de %d lettres ?\n\n", decalage);
		
		printf ("Ecrivez 1 pour Oui ou 0 pour Non\n\n");
		scanf  ("%d", &crypter);
		
		if (crypter == 1)
		{
			system ("cls");		
			cesar_crypt (decalage, texte);
			printf ("\n---== Texte apres chiffrement ==---\n\n\n");
			printf ("%s\n", texte);
			printf ("\n\n---== Texte apres chiffrement ==---\n\n");
			
			fichier = fopen("readme.txt", "a+");
			
			if (fichier != NULL)
			{
				fprintf(fichier, "\n\nTexte Crypte : \n\n%s", texte);
				fclose(fichier); 
			}    
			pause (1);	 
		}
		else if (crypter == 0)
		{
			system ("cls");
			printf ("\nAu revoir, et bonne journee\n\n");
			pause (1);		
		}
		else if (crypter < 0 || crypter > 1)
		{
			printf ("\nVeuillez entrer 0 ou 1\n\n");
			scanf ("%d", &crypter);
			
			while (crypter < 0 || crypter > 1)
			{
				printf ("\nVeuillez entrer 0 ou 1\n\n");
				scanf ("%d", &crypter);
			}
			
			if (crypter == 1)
			{
				system ("cls");		
				cesar_crypt (decalage, texte);
				printf ("\n---== Texte apres chiffrement ==---\n\n\n");
				printf ("%s\n", texte);
				printf ("\n\n---== Texte apres chiffrement ==---\n\n");
				
				fichier = fopen("readme.txt", "a+");

				if (fichier != NULL)
				{
					fprintf(fichier, "\n\nTexte Crypte : \n\n%s", texte);
					fclose(fichier); 
				} 
				pause (1);	 
			}
			else if (crypter == 0)
			{
				system ("cls");
				printf ("\nAu revoir, et bonne journee\n\n");
				pause (1);			
			}
		}
	}

	if (menu == 2)
	{
		int decalage = 26 ;	

		FILE* fichier = NULL;	
		
		char *texte;
		texte = openfichier();
		
		while (decalage > 0)
		{
			cesar_crypt (decalage, texte);

			fichier = fopen("readme.txt", "a+");
			if (fichier != NULL)
			{
				fprintf(fichier, "\n\n%s", texte);
				fclose(fichier); 
			} 
			decalage--;		
		}

		system("cls");
		printf("\n\nDecryptage reussi, disponible dans le fichier readme.txt\n\n");
		pause(1);
	}

	if (menu == 3)
	{
		getchar();
	}
	if (menu > 3 || menu < 1)
	{
		exit(EXIT_FAILURE);
	}
}
 
void clean_stdin (void) 
{
    int c = 0;
    do
    {
      c = getchar();
    } 
	while (c != '\n' && c != EOF);
}
 
void pause (int b)
{
    printf ("\nAppuyez sur Entrer pour quitter\n");
    if (b==0)
        getchar ();
    else if (b==1)
    {
        clean_stdin ();
        getchar ();
    }
}
/*Merci a SoftEvans, Melem, Pouet_forever et Brunews*/

Conclusion :


Si vous avez des questions ou des améliorations sur cette source, n'hésitez pas ;)

Enjoy

Antoinejdu44

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_ghuysmans99
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
La série des "if (menu == X)" peut être remplacée par un switch.
"else if (crypter == 0) " n'a aucun sens : si crypter est booléen et qu'il ne vaut pas 1, il vaut 0 !
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
C'est dans l'autre sens, un indicateur vaut 0 pour FAUX ou nimporte quoi d'autre sera VRAI.

Comme pour toutes les "Cesaritudes" qu'on a sur cppfrance et qui proposent les mêmes défauts de débutants:
for(i=0 ; i<strlen(texte) ; i++)
NON et NON, tu ne modifies pas la longueur, il est donc improductif de la recalculer à chaque tour. On peut ajouter qu'il est totalement inutile de parcourir la chaine 2 fois:
char a;
while(a = *texte) {
// TU TRAITES ICI
*texte++;
}
Antoinejdu44
Messages postés
4
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
5 janvier 2010

Merci de vos commentaires ;)

@ghuysmans99 : J'ai essayé de mettre un switch, mais je ne pouvais compiler (erreur de type : "" non-declaré)
@brunew : Je vais corriger avec ce que tu me dis, merci ;)
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
OUPS a la relecture:
char a;
while(a = *texte) {
// TU TRAITES ICI
texte++;
}

et non pas *texte++ comme dit dans comment précédent.
Antoinejdu44
Messages postés
4
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
5 janvier 2010

Si j'ai bien compris, je dois remplacer
for(i=0 ; i<strlen(texte) ; i++)

par

char i;
while(i = *texte) {

puis mettre

if ('a' <= texte[i] && texte[i] <= 'z')
texte[i] = 'a' + ((texte[i] - 'a') + decallage)%26;
else

if ('A' <= texte[i] && texte[i] <= 'Z')
texte[i] = 'A' + ((texte[i] - 'A') + decallage)%26;
else
{
}
et après

texte++;
}

C'est sa ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.