Soyez le premier à donner votre avis sur cette source.
Vue 15 218 fois - Téléchargée 504 fois
#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; } }
21 janv. 2004 à 12:45
les caractères spéciaux ne sont meme pas cryptés et le fameux coefficient de cryptage est tous simplement symbolique puisque le fait de mettre 1 ou 20 n'augmente pas la difficulté de décryptage.....
Je n'y connait pas grand chose en crypto mais je suis désolé ça va pas chercher loin ton algo...
Rien que ce petit bou de machin est déjà plus compliqué que ton truc :
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
int j;
char c[30];
printf("Texte à crypter (Ctrl + C pour arrete) : ");
scanf("%s", &c);
printf("==========================================================\n");
printf("Cle saisie : %s\n", c);
printf("Cle codee : ");
int table_ascii[30];
char table_code[30];
char * adr ;
char key_code[30];
adr = c ;
j=0;
while (*adr)
{
table_ascii[j]=*adr;
table_code[j]=table_ascii[j] + (j - 5);
printf ("%c", table_code[j]);
j++;
adr++ ;
}
printf("\n TERMINE\n");
return 0;
}
et là ton www.cppfrance.com devient rst,bpqhuesil6lyx .....
16 janv. 2004 à 16:30
ici sauf erreur c'est de l'encodage, donc tout programmeur en la possession de ce code source peut décrypter tout ce qui a été crypté par ce programme, donc faiblesse. je dis ça pour te prévenir de ne pas utiliser cet algo dans un projet sérieux. ceux qui se sont un peu cassé là tête sur les challenges de crypto/stégano sur www.hackquest.de (en allemand et anglais), se sont bien rendus compte qu'en qq heures on peut casser (parfois même à la main!) des données encodées sans informations précises. même pas en brute forçant.
si tu écris un algo de cryptage sérieux, il va te falloir inclure une clef de cryptage qui ait une importance primordiale, de telle sorte que (presque) uniquement du Brute Force puisse en venir à bout (or le brute force, on connaît tous ses limites ;-))
PS: le screenshot, tu as mis celui de ton code de morse ;-)
15 janv. 2004 à 13:39
sinon using namespace std; est reservé aux nouveaux flux
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.