Crypter-decrypter en utilisant l'algorithme de cesar

Soyez le premier à donner votre avis sur cette source.

Vue 17 627 fois - Téléchargée 1 804 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

Antoinejdu44
Messages postés
4
Date d'inscription
jeudi 28 décembre 2000
Statut
Membre
Dernière intervention
5 janvier 2010

Okey, merci, j'avais pas compris le
// tu traites ici
dans ton code ^^
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
Il n'y a plus notion d'itérateur "texte[i]" puisqu'on déplace le pointeur.

Un truc dans ce genre:
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++;
}
}
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 ?
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
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

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 ;)

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.