Code de cesar (chiffre/déchiffre) en c.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 46 731 fois - Téléchargée 32 fois

Contenu du snippet

Chiffre et déchiffre un fichier texte selon le code de César.

Le code source est en C (dur dur).

Source / Exemple :


// code de cesar

#include <stdio.h>
#include <stdlib.h>

// flush
void flush()
{
	while( getchar() != '\n' )
		continue;
}

// programme principal
int main()
{
	int decalage = 0;
	char nom_fichier[256];
	char choix = 'c';
	// choix
	printf( "Code de Cesar\n" );
	printf( "\nSaisir le décalage : " );
	scanf( "%d", &decalage );
	flush();
	printf( "\nSaisir le nom du fichier : " );
	scanf( "%s", nom_fichier );
	flush();
	printf( "\nChiffrement [c] ou déchiffrement [d] : " );
	scanf( "%c", &choix );
	// synthèse
	switch( choix )
	{
	case 'c' :
		printf("\nVous avez demandé le chiffrement du fichier %s avec un décalage de %d.\n", nom_fichier, decalage );
		{
			int index;
			int taille_fichier = 0;
			FILE * fichier_avant = NULL;
			FILE * fichier_apres = NULL;
			int taille_memoire_tamon = 1024;
			char * memoire_tampon = NULL;
			// allocation
			memoire_tampon = (char*)malloc(taille_memoire_tamon);
			// mise en mémoire tampon
			fichier_avant = fopen( nom_fichier, "r" );
			taille_fichier = fread( memoire_tampon, 1, taille_memoire_tamon, fichier_avant );
			fclose( fichier_avant );
			// chiffrement dans le mémoire tampon
			for( index = 0; index != taille_fichier; ++index )
			{
				// chiffrement des majuscules
				if( memoire_tampon[ index ] >=65 && memoire_tampon[ index ] < 91 )
					memoire_tampon[ index ] = ( ( memoire_tampon[ index ] - 65 ) + decalage ) % 26 + 65;
				// chiffrement des minuscules
				if( memoire_tampon[ index ] >=97 && memoire_tampon[ index ] < 123 )
					memoire_tampon[ index ] = ( ( memoire_tampon[ index ] - 97 ) + decalage ) % 26 + 97;
			}
			// mise a jour du fichier
			fichier_apres = fopen( nom_fichier, "w" );
			fwrite( memoire_tampon, 1, taille_fichier, fichier_apres );
			fclose( fichier_apres );
			// desallocation
			free( memoire_tampon);
		}
		return 0;
	case 'd' :
		printf("\nVous avez demandé le déchiffrement du fichier %s avec un décalage de %d.\n", nom_fichier, decalage );
		{
			int index;
			int taille_fichier = 0;
			FILE * fichier_avant = NULL;
			FILE * fichier_apres = NULL;
			int taille_memoire_tamon = 1024;
			char * memoire_tampon = NULL;
			// allocation
			memoire_tampon = (char*)malloc(taille_memoire_tamon);
			// mise en mémoire tampon
			fichier_avant = fopen( nom_fichier, "r" );
			taille_fichier = fread( memoire_tampon, 1, taille_memoire_tamon, fichier_avant );
			fclose( fichier_avant );
			// déchiffrement dans le mémoire tampon
			for( index = 0; index != taille_fichier; ++index )
			{
				// déchiffrement des majuscules
				if( memoire_tampon[ index ] >=65 && memoire_tampon[ index ] < 91 )
					memoire_tampon[ index ] = ( ( memoire_tampon[ index ] - 65 ) - decalage ) % 26 + 65;
				// déchiffrement des minuscules
				if( memoire_tampon[ index ] >=97 && memoire_tampon[ index ] < 123 )
					memoire_tampon[ index ] = ( ( memoire_tampon[ index ] - 97 ) - decalage ) % 26 + 97;
			}
			// mise a jour du fichier
			fichier_apres = fopen( nom_fichier, "w" );
			fwrite( memoire_tampon, 1, taille_fichier, fichier_apres );
			fclose( fichier_apres );
			// desallocation
			free( memoire_tampon);
		}
		return 0;
	default:
		return -1;
	}
}

Conclusion :


C'est un premier jet pour répondre rapidement à une demande. Je factoriserai certaines protions de code.

A voir également

Ajouter un commentaire

Commentaires

xterminhate
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

...et l'algorithme cryptographique est encore renforcé en utilisant un mode "chainé" (genre CBC,...) en rendant chaque bloc cryptographique dépendant.
mythic_kruger
Messages postés
242
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

Le code est très redondant (chiffrer/déchiffrer) néanmoins c'est un sujet toujours d'actualité et source de bon sens.
Casser un XOR ou un César à partir du moment ou on sait dire si le texte déchiffré est cohérent, c'est pas plus compliqué mais c'est plus long! lol
Le stade au dessus du César est l' utilisation d'une clé de cryptage et ceci a pour effet sur le code crypté de ne pas présenter de récurrence de caractère. En effet, dans le cas du césar, le A devenant toujours D est identifié par cette corelation définie par le décalage de 3. Or, dans le cas du codage avec une clé, le code ASCII du caractère à convertir n'est pas décalé de 3 mais de la valeur de décalage issue du caractère de même index de la clé. Coder AA en César donne DD. avec une clé de cryptage, AA deviendrait ùp par exemple... D'autant plus puissant et long à casser que la clé est longue. La règle n°1 étant de développer sur une machine non connectée au réseau (sans mail) quel que soit l'algorythme de cryptage.
cs_dominion
Messages postés
230
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
15 mai 2008

Bien vu, mais bon pour César il suffit de partir du principe que le 'e' en fr ressort le plus souvent (dans le cas de longs textes, s'entend), de touver la lettre qui ressort le plus souvent, puis de simplement calculer le delta(le pas si tu préfère) et bon là c'est gagné...

On peut même demander à l'user si c'est juste (99% des cas : oui), et si cela ne l'est pas, ben il recommence en considérant le deuxième plus présent etc...

Par contre, avec une substitution, il y a beaucoup plus de cas, et l'erreur est vite faite !

Pour casser un cryptage, il faut toujours se trouver derrière, sauf si tu t'amuse à créer un dico et à regarder si la majorité des mots dans le texte cassé est dans ton dico, si c'est le cas c'est bon... Mais c'est long et un peu inutile, il faut avouer...
xterminhate
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

L'interêt consiste à automatiquer le processus de cryptanalyse. Ce n'est pas plus compliqué de casser un XOR ou un César à partir du moment ou tu sais dire si le texte déchiffré est conhérent. Non ?
cs_dominion
Messages postés
230
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
15 mai 2008

Ben, c'est ridicule ! Tu passe la première ligne du fichier césarée 26 fois et l'utilisateur dit laquelle est bonne et c'est bon ! Pourquoi se fatiguer ?

J'ai un défi plus intéressant : faire de même, mais avec un XOR, ou autre substitution quelconque... Là ça devient marrant !

(Et pour les plus mazo, ya toujours Vigenère ;-P)

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.