Liste des sujets
1. Chiffrement de César
Objectifs
Réaliser un programme en C permettant de chiffrer un message à l’aide de l’algorithme de César.
Proposer ensuite un algorithme réalisant une cryptanalyse de ce moyen de chiffrement.
Tâches à réaliser
- - Implanter un algorithme qui demande à un utilisateur d’entrer un message et une clef de chiffrement.
- - Réaliser le chiffrement de César du message entré.
- - Proposer une ou plusieurs méthodes de cryptanalyse de ce cryptosystème.
- - Implanter cette cryptanalyse.
- - Tester votre programme.
- - Préparer une soutenance présentant le travail réalisé.
Vous prendrez la suite des travaux suivants :
Vous partirez du code C suivant donnant le chiffrement et le déchiffrement.
Code C du chiffrement-déchiffrement et cryptanalyse
#include <stdio.h> //bibliothéques
#include <iostream>
#include <conio.h>
#include<math.h>
//#include<windows.h>
using namespace std;
int main (void) //commencement du programme
{
int clef; //déclaration de la variable "clef" qui servira
//pour la formule du chiffrement
int i; //déclaration de la variable "i" qui servira
//d'indice pour les boucles
i=0; //initialisation de la variable "i" à 0
char phrase [100]; //déclaration du tableau d'entier "phrase" qui sera le nombre
//qui aura pour valeur un caractère pour effectuer le chiffrement
//après le chiffrement
int maj ; //déclaration de l’entier « maj » qui permettra de mettre en majuscule l’alphabet
maj = 0; //initialisation de « maj » à 0
int k; //déclaration de l’entier « k » qui permettra servira
//d’indice pour les boucles
char ch; //déclaration du caractère « ch » qui seront les caractères chiffrés
int test = 0;
int a; // déclaration de l'entier pour choisir le mode de chiffrement;
char mot[30]; // Tableau de caractère qui stockera notre mot
int nombre_lettre[26]; // Tableau d'entier qui stockera le nombre de fois que chaque lettre apparait
int n = 0; // Compteur permettant de parcourir le mot
int cpt_caractere = 0; // Compteur permettant de compter les caractères
char caractere = 'a'; // Caractere que l'on veut compter
int lng_mot = 0; // Longueur du mot que l'on veut compter
char caractere_max = 'a'; // Caractère qui apparait le plus de fois
const char alphabet[] = {'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','.',',','?','!',';','@','+','-','*','/','%','_','#','"','|','{','}','[',']','(',')'}; //déclaration de l’alphabet
do
{cout<<"vous choisissez le mode de déchiffrement ou chiffrement? 1- phrase chiffre, 2-phrase déchiffre avec cle, 3-phrase a déchiffrer sans cle"<<endl;
cin>>a;
}while(a!=1 && a!=2 && a!=3 );
if(a==1)
{
cout<<"Entrez une phrase"<<endl; //lecture de la phrase
cin>>phrase; //écriture de la phrase
cout<<"Choisissez votre decalage "<<endl; //lecture de la phrase
cin>> clef; //écriture de la phrase
cout<<"phrase chiffree : "<<endl;
while(phrase[i]!='\0') //c'est la marque de fin de caractère du tableau
{
maj = isupper (phrase[i]); //fonction de référence
ch = tolower(phrase[i]); //fonction de référence
for (k = 0; k < 57; k++) //boucle “for” qui s’arrête à 26
{
if (alphabet[k] == ch) //si alphabet = caractère
{
ch = alphabet[(k+clef)%57]; //utilisation de la formule du chiffrement de César
if (maj) //si majuscule
ch = toupper (ch); //fonction de référence
cout<<ch; //lecture de la phrase
break;
}
}
i++; //incrémentation de i
}
}
else if(a==2)
{
cout<<"Entrez une phrase"<<endl; //lecture de la phrase
cin>>phrase; //écriture de la phrase
cout<<"Choisissez votre decalage "<<endl; //lecture de la phrase
cin>> clef; //écriture de la phrase
cout<<"phrase dechiffree : "<<endl;
while(phrase[i]!='\0') //c'est la marque de fin de caractère du tableau
{
maj = isupper (phrase[i]); //fonction de référence
ch = tolower(phrase[i]); //fonction de référence
for (k = 0; k < 57; k++) //boucle “for” qui s’arrête à 26
{
if (alphabet[k] == ch) //si alphabet = caractère
{
ch = alphabet[(k+(57-clef))%57]; //utilisation de la formule du chiffrement de César
if (maj) //si majuscule
ch = toupper (ch); //fonction de référence
cout<<ch; //lecture de la phrase
break;
}
}
i++; //incrémentation de i
}
}
else if(a==3)
{
cout<<"\nRentrez un mot que l'on dechiffera avec les lettres suivantes"
"comme reference: e puis a puis s puis i puis t et n:"<<endl;
cin>> mot;
cout<<endl;
lng_mot = (int) strlen (mot); // Calcule de la taille du mot rentré
do
{
while (n < lng_mot) // Tant que l'on se trouve dans le mot
{
if (mot[n] == caractere) // Si un caractere du mot est égale au caractère cherché
{
cpt_caractere++;
}
n++;
}
nombre_lettre[caractere - 97] = cpt_caractere; // On stocke le nombre de fois que le caractère à été rencontré dans un tableau
if (nombre_lettre[caractere - 97] > nombre_lettre[caractere_max-97])// Si ce nombre de caractère est plus grand que le nombre de caractère max
caractere_max = caractere; // Le caractère devient le caractère max
n = 0;
cpt_caractere = 0;
caractere ++; // on regarde le caractère suivant
} while ( caractere != 123); // tant que l'on n'a pas parcourut tout l'alphabet
cout<<"Le caractere qui apparait le plus dans ce mot est :"<< caractere_max<<endl; // On affiche le résultat
cout<<endl;
while (test < 6)
{
i = 0;
k = 0;
ch = 0;
maj = 0;
if (test == 0)
clef = 'e' - caractere_max;
if (test == 1)
clef = 'a' - caractere_max;
if (test == 2)
clef = 's' - caractere_max;
if (test == 3)
clef = 'i' - caractere_max;
if (test == 4)
clef = 't' - caractere_max;
if (test == 5)
clef = 'n' - caractere_max;
cout<<endl;
cout<<"\nle nombre de decalage qu'il faut effectuer est de "<< labs(clef)<<endl;
if(clef < 0)
{
cout<<"phrase dechiffree : "<<endl;
while(mot[i]!='\0') //c'est la marque de fin de caractère du tableau
{
maj = isupper (mot[i]); //fonction de référence
ch = tolower(mot[i]); //fonction de référence
for (k = 0; k < 57; k++) //boucle “for” qui s’arrête à 26
{
if (alphabet[k] == ch) //si alphabet = caractère
{
ch = alphabet[(k+(57-labs(clef)))%57]; //utilisation de la formule du chiffrement de César
if (maj) //si majuscule
ch = toupper (ch); //fonction de référence
cout<<ch; //lecture de la phrase
break;
}
}
i++; //incrémentation de i
}
}else
{
while(mot[i]!='\0') //c'est la marque de fin de caractère du tableau
{
maj = isupper (mot[i]); //fonction de référence
ch = tolower(mot[i]); //fonction de référence
for (k = 0; k < 57; k++) //boucle “for” qui s’arrête à 26
{
if (alphabet[k] == ch) //si alphabet = caractère
{
ch = alphabet[(k+clef)%57]; //utilisation de la formule du chiffrement de César
if (maj) //si majuscule
ch = toupper (ch); //fonction de référence
mot[i] = ch; // affectation de « ch » avec les caractères de « phrase[i] »
i++; //incrémentation de i
break;
}
}
}cout<<endl;
cout<<"phrase chiffree : "<<mot<<endl; //lecture de la phrase
}
test++;
}
cout<<endl;
}
_getch();
}
2. Chiffrement de Vigenère
Objectifs
Réaliser un programme en C permettant de chiffrer un message à l’aide d’un algorithme de chiffrement de Vigenère.
Proposer ensuite un algorithme réalisant une cryptanalyse de ce moyen de chiffrement.
Tâches à réaliser
- - Implanter un algorithme qui demande à un utilisateur d’entrer un message et une clef de chiffrement.
- - Réaliser le chiffrement par permutations du message entré.
- - Proposer une ou plusieurs méthodes de cryptanalyse de ce cryptosystème.
- - Implanter cette cryptanalyse (en commençant par un message de petite taille).
- - Tester votre programme.
- - Préparer une soutenance présentant le travail réalisé.
Vous prendrez la suite des travaux suivants :
3. Filtre OL
Objectifs
Réaliser un programme avec maple permettant de représenter le diagramme de Bode des filtres du premier ordre comme vu ici.
Proposer ensuite un code pour tous les types de filtre d’ordre 1 que vous connaissez.
Tâches à réaliser
- - Reprendre et comprendre le TP sur les diagrammes de Bode sur Maple
- - Lister tous les filtres du premier ordre que l’on connait (passe-haut, passe bas, passe bande)
- - Réaliser le tracer du diagramme de Bode de ces filtres