Cryptage/décryptage d'un texte par rotation des caractères alphabétiques.

Description

Cryptage/Décryptage d'un texte par rotation des caractères alphabétiques.Il faut tapper le texte ou faire copier coller et le prog vous affiche votre texte crypté.
Le décryptage se base sur le nombre d'occurence de la lettre 'e' (lettre la plus fréquente de l'alphabet).

Source / Exemple :

#include <iostream.h>
#include <ctype.h>

using namespace std;
const int MAX=1000;

int remplir(char tab[MAX]);
void compteLettres(char tab[MAX],int nbCar,int freq[26]);
char lettreLaPlusFrequente (int freq[26]);
void cryptage(char tab[MAX],int nbCar,int k);
void decryptage(char tab[MAX],int nbCar,char carFreq);
void affichage(char tableau[MAX],int nbVal);

int remplir(char tab[MAX]) 
{   
	// Procédure qui saisit le texte à crypter ou décrypter //
    // place les caractères dans le tableau et retourne leur nombre //

	char car;
	int i=-1;
	cout<<"Veuillez entrer votre texte. ('$' pour arreter)"<<endl;
	cout<<"***********************************************"<<endl;
	cout<<"<<"<<endl;
    	do  {
   		    i++;
		    cin.get(tab[i]);
        	}
    	while((tab[i]!='$')&&(i<=MAX-2));
	cout<<">>"<<endl;
	if (tab[i]=='$') i--;
	return(i+1);
}


void compteLettres(char tab[MAX],int nbCar,int freq[26])
{
        // Procédure qui compte le nombre de lettres //

	int i,numLettre;
	for(i=0;i<=nbCar;i++)
		{
		numLettre=(tolower(tab[i]))-97;
		freq[numLettre]++;
		}
}

char lettreLaPlusFrequente (int freq[26]) {
        // Fonction qui trouve la lettre la plus fréquente,  //
        // retiens sa position dans l'alphabet //
        // et met 0 dans le tableau à l'adresse de ce caractère pour ne pas
        // le réutiliser si on tente plusieurs décryptages //
	int i,frequente=-1,position=-1;
	char car;
	for(i=0;i<=25;i++) 
		{
		if (freq[i]>frequente)
			{
			frequente=freq[i];
			position=i;
			}
		}	
	car=position+97;
    freq[position]=0;
	return(car);
}

void cryptage(char tab[MAX],int nbCar,int k) {
     // Procédure qui crypte chaque caractère en fonction  //
     // de la clé entrée par l'utilisateur                //

	int i;
    	k=k%(26);        // remet la clé dans l'intervalle [-26 , 26] //


	for(i=0;i<=nbCar-1;i++) 
	{
        // CODAGE DES LETTRES MINUSCULES PAR LE BIAIS DU CODE ASCII //

        // Si la clé est supérieure à 0 //
		if ((k>0) && ((tab[i]) <=122)   && ((tab[i]) >=97))
			{

		    if   (((tab[i]+k) <=122)   && ((tab[i]+k) >=97))  tab[i]+=k;
                  // si tab[i]+k est dans l'intervalle des minuscules : ajouter k //


            else tab[i]=96+k-122+tab[i];
                  // sinon cela implique que l'on dépasse le caractère 'z' //
                  // à ce moment là on doit  repartir du début de l'alphabet minuscule soit à 96 //
            }

        // Si la clé est inférieure à 0 //
		else if (((tab[i]) <=122)  && ((tab[i]) >=97))	
			{
			if (((tab[i]+k) <=122)   && ((tab[i]+k) >=97))   tab[i]+=k;
			else   tab[i]=122-96+k+tab[i];
            }


		// CODAGE DES LETTRES MAJUSCULES PAR LE BIAIS DU CODE ASCII //
		// Si la clé est supérieure à 0 //
		if ((k>0) && ((tab[i]) <=90)   && ((tab[i]) >=65))
			{
  	        if   (((tab[i]+k) <=90)   && ((tab[i]+k) >=65))  tab[i]+=k;
          	else tab[i]=64+k-90+tab[i];
			}
        // Si la clé est inférieure à 0 //
		else if (((tab[i]) <=90)  && ((tab[i]) >=65))	
			{
			if (((tab[i]+k) <=90)   && ((tab[i]+k) >=65))   tab[i]+=k;
			else   tab[i]=90-64+k+tab[i];
			}
	}
}



void decryptage(char tab[MAX],int nbCar,char carFreq)
{
     // Fonction qui décrypte chaque caractère en fonction  de la clé trouvée //


	int k,i;
	k=carFreq-'e';

	for(i=0;i<=nbCar-1;i++) 
		{
            // DECODAGE DES LETTRES MINUSCULES PAR LE BIAIS DU CODE ASCII //

            // Si la clé est supérieure à 0 //
            if ((k>0) && ((tab[i]) <=122)   && ((tab[i]) >=97))
				    {
			     	if   (((tab[i]-k) <=122)   && ((tab[i]-k) >=97))  tab[i]-=k;
                              // si tab[i]-k est dans l'intervalle des minuscules : soustraire k //

                    else tab[i]=-96-k+122+tab[i];
                              // sinon cela implique que l'on dépasse le caractère 'a'   //
                              // à ce moment là on doit  repartir de la fin de l'alphabet//
			      //minuscule soit à 122                                     //
                    }

            // Si la clé est inférieure à 0 //
			else if ( (k<0) && ((tab[i]) <=122)  && ((tab[i]) >=97))	
				    {
				    if (((tab[i]+k) <=122)   && ((tab[i]+k) >=97))   tab[i]+=k;
				    else tab[i]=122-96+k+tab[i];
				    }
		

            // DECODAGE DES LETTRES MAJUSCULES PAR LE BIAIS DU CODE ASCII //

            // Si la clé est supérieure à 0 //
			if ((k>0) && ((tab[i]) <=90)   && ((tab[i]) >=65))
				{
		     		if   (((tab[i]-k) <=90)   && ((tab[i]-k) >=65))  tab[i]-=k;
				else tab[i]=-65-k+91+tab[i];
				}
            // Si la clé est inférieure à 0 //
			else if ( (k<0) && ((tab[i]) <=90)  && ((tab[i]) >=65))	
				{
				if (((tab[i]+k) <=90)   && ((tab[i]+k) >=65))   tab[i]+=k;
				else tab[i]=91-65+k+tab[i];
				}

		}
}


void affichage(char tableau[MAX],int nbVal)      // Procédure d'affichage de tableaux //
{
	for(int i=0;i<=nbVal-1;i++) cout<<tableau[i];
	cout<<endl;
}





void main()		// Fonction principale // 
{ 	

	char carFreq;
	int freq[26]={0};
	char tab[MAX];
	int i,nbCar,k,rep,choix,cpt=0;
		
	cout<<endl;
	cout<<"       ****************************"<<endl;
	cout<<"       *  Mini-projet de C++ No2  *"<<endl;
	cout<<"       *                          *"<<endl;
	cout<<"       *       Programme de       *"<<endl;
	cout<<"       *    cryptage/decryptage   *"<<endl;
	cout<<"       *                          *"<<endl;
	cout<<"       *    Benzekri Sebastien    *"<<endl;
	cout<<"       *   Lanouguere  Baptiste   *"<<endl;
	cout<<"       ****************************"<<endl<<endl;
		

	nbCar=remplir(tab);    // Appelle la fonction "remplir" pour saisir le texte//

	cout<<endl;
	cout<<"Vous avez rentre les "<<nbCar<<" caracteres suivants :"<<endl;
	cout<<"*********************************************"<<endl;
    affichage(tab,nbCar);                       // Affichage du texte entré //

	cout<<endl<<"Voulez vous decoder[1] ou coder[2] ? "<<endl;
    cout<<"************************************"<<endl;
    do {
	cout<<">> ";              // Choix de l'utilisateur : cryptage ou décryptage //
	cin>>rep;
	}
	while(rep!=1 && rep!=2);
    cout<<endl<<endl<<endl;
	
	// PARTIE DECODAGE //
	if (rep==1)
	   {
    	compteLettres(tab,nbCar-1,freq);   // Procésure qui compte le nombre de lettres //
    		do
                {
                carFreq=lettreLaPlusFrequente(freq); //Appelle la fonction "lettreLaPlusFrequente"//

                cout<<endl<<endl;
                cout<<"Le caractere le plus utilise est : "<<carFreq<<endl;

                decryptage(tab,nbCar,carFreq);     // Appelle la procédure de décryptage //

                cpt++;
                cout<<endl<<"Tentative de decryptage no "<<cpt<<" sur "<<nbCar<<" :"<<endl;
                cout<<"**************************************"<<endl;

                affichage(tab,nbCar);           // Affichage du texte décrypté //

                cout<<endl<<"Voulez-vous retenter ([1]=oui [2]=non) ?"<<endl<<">> ";
                cin>>choix;                     // Demande si l'utilisateur est satisafait et //
                                                // continue le cas échéant //
                        }
                while(choix!=2 && cpt<nbCar);
             cout<<endl<<endl;
             if(nbCar==cpt) cout<<"Desole, le nombre de tentatives maximum est depasse."<<endl;
             else if (choix==2) cout<<"Vous avez mis fin au processus"<<endl;
      	     cout<<"*** Decryptage termine ***"<<endl<<endl;
      
      }
      
      
      

     
     	// PARTIE CODAGE //
     else
	    {
      	cout<<endl<<endl;
	    cout<<"Saisissez le coefficient de cryptage :"<<endl;
	    cout<<"**************************************"<<endl<<">> ";
	    cin>>k;                                   // Saisie du coefficient de cryptage //

     	cryptage(tab,nbCar,k);                    // Appelle la procédure de cryptage //
	
     	cout<<endl;
     	cout<<"Voici votre texte crypte :"<<endl;
     	cout<<"**************************"<<endl;
     	affichage(tab,nbCar);                     // Affichage du texte décrypté //
     	cout<<endl;
	    }
}

Conclusion :

Un texte sans la lettre 'e' peut etre décrypté mais au bout d'un certain nombre de fois :-(

MàJ:
le programme se fermait imméditement sans que l'on puisse voir le texte...j'ai rajouté une pause.

Codes Sources

A voir également

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.