Cryptage/decryptage vigenere

0/5 (4 avis)

Snippet vu 28 072 fois - Téléchargée 29 fois

Contenu du snippet

Ce programme écrit en C crypte un message en utilisant la grille de Vigenere et une clé et le décrypte instantanément. Je suis débutant en C, et j'ai remarqué que mon programme ne marche qu'avec la clé 'toto'. De plus, il ne semble marcher différemment selon les compilateurs C. Un grand merci à la personne qui pourra me dire comment bien le faire marcher...

Source / Exemple :


//  Grille de Vigenere

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

main()

{
     int i,j,k,l;               // Variables
     char G[37][37];            // Grille de Vigenere
	 char texte[88];            // Texte a crypter
	 char cle[88];              // Cle de codage : Dans ce programme, uniquement entrer 'toto'
	 char textecrypte[88];      // Sans commentaires...
	 char textedecrypte[88];

     for(i=0;i<37;i++)           // Boucles et conditions générant la grille automatiquement
     {
	     for(j=0;j<26;j++)

		     G[i][j]= 97 + j;

			     if (G[0][25]==122)
			     {
				     G[i][26]=32;
				     for (j=27;j<37;j++) G[i][j]= 48 + (j-27)  ;
			  }
     }

for(i=1;i<37;i++)

{

	for(j=0;j<36;j++) G[i][j]=G[i-1][j+1];
           if (j==36)  G[i][j]=G[i-1][0];

     }       					// Fin de l'algorithme

     printf("Affichage de la table:\n");

     for (i=0;i<37;i++)
     {									// Affichage de la grille de Vigenere
	     for (j=0;j<37;j++)
	     	     printf("%c",G[i][j]);

	     printf("\n");
	     }

     printf("\nFin\n");

	 printf("Entrer le texte à crypter sans caractères spéciaux svp\n");  // Condition d'entrée du texte

	  gets(texte);

	 printf("Texte entré:\n");
	 puts(texte);

	 printf("Entrer la clé:\n");
	 gets(cle);

	 printf("Clé entrée:\n");
	 puts(cle);

	for (i=0;strlen(cle)<strlen(texte);i++)			// Génération de la clé sur toute la longueur du texte (toto)
{
	cle[i+4]=cle[i];

}

printf("Clé sur toute la ligne:\n");
puts(cle);

		printf("\nCryptage en cours:\n");

													// Cryptage //

	  j=0;
	 l=0;
	 k=0;

	 for (i=0;l<strlen(texte);j++)
{

	if(G[0][j]==texte[l])
	{
		for(i=0;l<strlen(texte);i++)
		{
			if(G[i][0]==cle[l])
			{
				textecrypte[k]=G[i][j];
				k++;
				l++;
				j=0;
				break;
			}

		}

	}

}

printf("Texte crypte:\n");							// Affichage du texte crypté (sans caractères spéciaux)
puts(textecrypte);

l=0;
k=0;
for (j=0;l<strlen(texte);i++)                        // Décryptage
{

		if (G[i][0] == cle[l])
		{
                    for (j=0;l<strlen(texte);j++)
			    if (G[i][j]==textecrypte[k])
			    {
				    textedecrypte[k]=G[0][j];
				    k++;
				    l++;
				    i=0;
				    break;
			    }

		}
}
printf("Texte decrypte:\n");
puts(textedecrypte);								// Affichage du texte décrypté (avec clé 'toto')

}

A voir également

Ajouter un commentaire Commentaires
G0ss3Yn Messages postés 65 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 5 novembre 2010
8 juin 2004 à 21:27
Hello, j'ai fait le même type de source pour l' IUT, ils me forcent à coder en C !!! Au secours ! :D
Enfin, voilà la source si ça peut te servir... :

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

#define TS 93
#define MODE_CRYPT 1
#define MODE_DECRYPT 2


int
main( int ac, char *av[ ] )
{
char Message[ 100 ] ;
char Cle [ 100 ] ;
char Filtre [ 100 ] = "" ;
char MsgCode[ 100 ] = "" ;
char Tableau[ TS ] [ TS ] = {'a','b','c','d','e','f','g','h', 'i','j','k','l','m','n','o','p', 'q','r','s','t','u','v','w','x', 'y','z',' ','A','B','C','D','E', 'F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U', 'V','W','X','Y','Z','0','1','2', '3','4','5','6','7','8','9','0', ',',';',':','!','?','.','/','*', '$','(',')','[',']','{','}','_', '-','°','@','%','<','>','\'','é', 'è','"','à','+','='} ;
unsigned int i, j, k ;
unsigned int select ;

// On remplit le tableau
for( i = 1 ; i < TS ; i ++ )
for( j = 0 ; j < TS ; j ++ )
Tableau[ i ] [ j ] = Tableau[ 0 ] [ (i + j) % TS ] ;



while( 1 )
{

printf( "\n\nQue voulez-vous faire ? :\n"
"1...Crypter une chaine.\n"
"2...Decrypter une chaine.\n"
"0...Quitter.\n" ) ;

select = 3 ;

while( select > 2 )
{
printf( "\nVotre choix ? : " ) ;
scanf( "%d", &select ) ;
}

if( select )
{
printf( "Entrez un message : " ) ;

flushall( ) ;

if( select == MODE_CRYPT )
gets( Message ) ;
else
gets( MsgCode ) ;

printf( "Entrez la clef : " ) ;
gets( Cle ) ;

// Copie de la clée dans Filtre
while( strlen( Filtre ) <= strlen( Message ) )
strcat( Filtre, Cle ) ;

switch( select )
{
case MODE_CRYPT :
// Codage
for( i = 0 ; i < strlen( Message ) ; i ++ )
{
// Abscisse dans j
for( j = 0 ; j < TS ; j ++ )
{
if( Message[ i ] == Tableau[ 0 ] [ j ] ) break ;
}

// Ordonnée dans k
for( k = 0 ; k < TS ; k ++ )
{
if( Filtre[ i ] == Tableau[ k ] [ 0 ] ) break ;
}

// On stock le caractère codé
MsgCode[ i ] = Tableau[ k ] [ j ] ;
}

printf( "\nMessage code : %s\n\n", MsgCode ) ;

break ;

case MODE_DECRYPT :
// Décodage
for( i = 0 ; i < strlen( MsgCode ) ; i ++ )
{
// Ordonnée dans j
for( j = 0 ; j < TS ; j ++ )
if( Filtre[ i ] == Tableau[ j ] [ 0 ] ) break ;

// Abscisse dans k
for( k = 0 ; k < TS ; k ++ )
if( MsgCode[ i ] == Tableau[ j ] [ k ] ) break ;

// On stock le caractère décodé
Message[ i ] = Tableau[ 0 ] [ k ] ;
}

printf( "\nMessage decode : %s\n\n", Message ) ;

break ;
}
} /* if select */
else
break ;
} /* while( 1 ) */

return 0 ;
}

Voilà, ça fonctionne avec n'importe quelle clée, mis à part que l'on pourrait se servir de l'opérateur modulo afin d'éviter le tableau...
Et même remarque que pour ton prog : Eviter les strlen dans les boucles for ;)

A+ !
f8ebl > G0ss3Yn Messages postés 65 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 5 novembre 2010
11 juil. 2016 à 16:40
bjr !
ça va mieux en remplaçant flushall() par :
fflush (stdin);
en tout cas sans ça, ça compile pas sous code::blocks.
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
29 janv. 2004 à 21:35
Evite de mettre des strlen d'une chaine de caractere dans le test d tes boucles for, c'est peu recommender, c'est cense le calculer a chaque fois, donc c'est long. Comme ceci est constant au niveau de la boucle, calcule le une fois pour toute en le mettant dans un variable.

(Peut etre que le compilateur optimise, mais tu n'es pas cense compter la dessus)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
29 janv. 2004 à 01:40
tant qu'à débuter, débute en C++ ;-)
dsl, j'ai pas franchement le tps de lire ton code source mtnt, j'essayerai pe de repasser une autre fois, mais je peux franchement rien te promettre

bonne continuation!

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.