Vous êtes sur la page 1sur 16

2022-2023 Langage C - TP

1
3iL I1 01. Cryptographie / Le chiffre de Vigenère

01. Cryptographie / Le chiffre de Vigenère

Principe général
Un système de cryptographie difficile à briser fut inventé au
XVIe siècle par le français Blaise de Vigenère. Il consistait en
une combinaison de différents chiffres de César.

On peut en effet écrire 25 alphabets décalés par rapport à


l’alphabet normal :
● l’alphabet qui commence par B et finit par …XYZA
● l’alphabet qui commence par C et finit par …YZAB
● etc.

Le codage va s’effectuer sur le principe du chiffre de César : on remplace la


lettre d’origine
par la lettre occupant la même place dans l’alphabet décalé.
Mais à la différence du chiffre de César, un même message va utiliser non un,
mais
plusieurs alphabets décalés. Pour savoir quels alphabets doivent être utilisés,
et dans quel
ordre, on utilise une clé.

Si cette clé est « SECRET » et le message « IL FERA BEAU DEMAIN », on procèdera


comme suit :
● La première lettre du message, « I », est la 9ème lettre de l’alphabet
normal. Elle doit être
codée en utilisant l’alphabet commençant par la première lettre de la clé, «
S ». Dans
cet alphabet, la 9ème lettre est le « A ». « I » devient donc « A »
● La deuxième lettre du message, « L », est la 11ème lettre de l’alphabet
normal. Elle doit
être codée en utilisant l’alphabet commençant par la deuxième lettre de la
clé, « E ».
Dans cet alphabet, la 11ème lettre est le « P ». « I » devient donc « P »,
etc.
● Quand on arrive à la dernière lettre de la clé, on recommence à la première.

Exemple de cryptage

Texte : I L F E R A B E A U D E M
A I N
Clé : S E C R E T S E C R E T
S E C R
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
↓ ↓ ↓ ↓
Résultat : A P H V V T T I C L H X
E E K E

Exemple visuel en ligne


● Allez à l'adresse : http://www.dcode.fr/chiffre-vigenere
● Vous pouvez saisir un message à coder dans la zone « MESSAGE CLAIR A
CHIFFRER
PAR VIGENERE ».

>3iL Ingénieurs
2022-2023 Langage C - TP
2
3iL I1 01. Cryptographie / Le chiffre de Vigenère

Remarques
● On n'utilise uniquement des lettres majuscules. Les lettres accentuées et
les chiffres
sont interdits. (Cette technique a été inventée à une époque où les messages
étaient
rédigés en latin).
● Les espaces sont ignorés. (A l'origine, il n'y avait pas d'espaces, les mots
étaient tous
collés les uns aux autres).

Étape n°1 – Cryptage d'une seule lettre


● Écrivez un programme qui utilise deux variables de type caractère :
− L'une contenant la lettre à crypter.
− L'autre contenant la lettre qui sert de clé, c'est-à-dire qui indique quel
est l'alphabet
décalé à utiliser.
Stockez dans une troisième variable, la valeur obtenue par le cryptage.
● Effectuez un affichage présentant ces 3 valeurs :
− La lettre à crypter
− La lettre servant de clé de cryptage
− La lettre résultant du cryptage
● A l'aide de l'exemple ci-dessus, vérifiez la validité de votre programme :
− I codé avec S devient A
− L codé avec E devient P

Remarque : il est possible d'écrire la formule de cryptage en une seule ligne


de code.
Mais, si c'est trop difficile, n 'hésitez pas à écrire un traitement de
plusieurs lignes.

Étape n°2 – Cryptage d'un message sans espaces


● Modifiez votre programme pour qu'il puisse gérer un message complet, écrit
en lettres
majuscules et ne comportant aucun espace.
Par exemple : ILFERABEAUDEMAIN
● Utilisez une clé qui est, elle aussi, composée de lettres majuscules et ne
comporte
aucun espace. Par exemple : SECRET
● Effectuez le traitement pour obtenir la version cryptée du message.
● Produisez un affichage qui permette de visualiser :
− Le message en clair.
− La clé de cryptage.
− Le message codé.
Vous devez utiliser des tableaux pour stocker ces 3 chaînes de caractères
avant de les
traiter et de les afficher.
● Vérifiez la validité de votre programme à l'aide de l'exemple ci-dessous :
Texte : ILFERABEAUDEMAIN
Clé : SECRET
Résultat : APHVVTTICLHXEEKE
>3iL Ingénieurs
2022-2023 Langage C - TP
3
3iL I1 01. Cryptographie / Le chiffre de Vigenère

Étape n°3 – Cryptage d'un message avec des espaces


● Modifiez votre programme pour qu'il puisse accepter un message comportant
des
espaces et que ces espaces soient reproduits dans le résultat du cryptage.
● Le résultat à obtenir doit ressembler à celui présenté ci-dessous :
− Texte : IL FERA BEAU DEMAIN
− Clé : SECRET
− Résultat : AP HVVT TICL HXEEKE

Étape n°4 – Gestion des minuscules dans le message


● Modifiez votre programme pour qu'il accepte que le message initial comporte
des
minuscules. Avant de procéder au cryptage, il faut d'abord le mettre en
majuscules en
appliquant les règles suivantes :
− Chaque caractère du message est analysé.
− Si c'est une lettre majuscule ou un espace, il reste inchangé.
− Si c'est une lettre minuscule non accentuée, elle est transformée en
majuscule.
− Si c'est un autre caractère que ceux cités précédemment, un message
d'erreur est
affiché et le traitement est interrompu.
● On ne s'occupe pas de la clé. On suppose que celle-ci ne contient que des
majuscules
et aucun espace.
● Vérifiez la validité de votre programme en utilisant les valeurs suivantes :
− Pour le message : il fera beau demain
− Pour la clé : SECRET
L'affichage obtenu doit ressembler à celui présenté ci-dessous :
− Texte : IL FERA BEAU DEMAIN
− Clé : SECRET
− Résultat : AP HVVT TICL HXEEKE
● Vérifiez que si l'on introduit un caractère invalide dans le texte à
crypter, un message
d'erreur est affiché.

Étape n°5 – Gestion des minuscules dans la clé


● Modifiez votre programme pour qu'il accepte que la clé comporte des
minuscules et des
espaces. Le fonctionnement à produire est identique à celui décrit à l'étape
précédente.
A une exception près :
− Les espaces contenus dans la clé sont supprimés. La longueur de la clé est
donc
réduite si celle-ci contient des espaces au départ.
● Vérifiez la validité de votre programme en utilisant les valeurs suivantes :
− Pour le message : il fera beau demain
− Pour la clé : se cre t
L'affichage obtenu doit ressembler à celui présenté ci-dessous :
− Texte : IL FERA BEAU DEMAIN
− Clé : SECRET
− Résultat : AP HVVT TICL HXEEKE
● Vérifiez que si l'on introduit un caractère invalide dans la clé, un message
d'erreur est

>3iL Ingénieurs
2022-2023 Langage C - TP
4
3iL I1 01. Cryptographie / Le chiffre de Vigenère

affiché.

Étape n°6 – Décryptage


Cette partie est réservée aux élèves qui sont en avance.
Son but est de permettre le décodage d'un message crypté.

Il existe plusieurs façon de procéder à ce décryptage. L'une d'elles consiste à


déterminer
la clé de décryptage qui correspond à la clé utilisée pour le cryptage.
Ensuite, il suffit de procéder comme pour un cryptage en appliquant cette clé
au message
crypté.

Le principe est simple. Pour chaque lettre de la clé de cryptage, il suffit de


déterminer
quelle est sa lettre symétrique par rapport à A.
● Pour A, c'est A
● Pour B, c'est Z
● Pour C, c'est Y
● etc.

Clé de cryptage : S E C R E T
↓ ↓ ↓ ↓ ↓ ↓
Clé de décryptage : I W Y J W H

Travail à effectuer :
● Modifiez votre programme pour que, juste après que la clé de cryptage ait
été formatée
(lettres mises en majuscules et espaces supprimés), son contenu soit
remplacé par
celui de la clé de décryptage correspondante.
A présent, votre programme n'est plus un programme de cryptage, mais un
programme
permettant de décrypter des messages qui ont été codés avec la clé indiquée.
● Vérifiez que vous êtes capables de décrypter le message suivant :
− Texte du message crypté : RETAQVFABACAE
− Clé ayant servi à le crypter : MAISON

Étape n°7 – Saisie par l'utilisateur


Cette partie est réservée aux élèves qui sont très en avance.

● Modifiez votre programme pour qu'il permette la saisie par l'utilisateur des
3
informations suivantes :
− Le message à traiter
− La clé de cryptage
− Le type de traitement à effectuer : cryptage ou décryptage.
>3iL Ingénieurs
2022-2023 Langage C - TP
5
3iL I1 01. Cryptographie / Le chiffre de Vigenère

Contrôle qualité
Pour que votre programme soit validé par le Service Qualité de
l'entreprise, il faut qu'il soit conforme aux normes qui ont été
mises en place.
Vérifiez que c"est bien le cas. Sinon, adaptez-le en conséquence.

Conformité du code
● 0 warning
Un avertissement (warning) est une alerte sur un problème potentiel. Même
s'il semble
mineur, il vaut mieux éviter d'en prendre le risque. Si nécessaire,
corrigez votre code
pour que, lors de la compilation, vous obteniez le message "0 warning".

Lisibilité du code
● Noms de variables explicites :
Donnez des noms explicites aux variables.
Utilisez la convention du Java pour l'utilisation des majuscules et des
minuscules,
lorsqu'un nom est composé de plusieurs mots. Exemple : messageEnClair
● Indentation du code :
Votre code doit être indenté de façon à permettre une lisibilité optimale.
Conseil : Utilisez les fonctionnalités de formatage de votre IDE s'il en a.
● Commentaires :
Plutôt que de multiplier les commentaires, il vaut mieux écrire un code qui
soit le plus
compréhensible possible à sa simple lecture :
− Noms des variables explicites,
− Présentation du code bien structurée,
− Simplicité du code.
Mettez des commentaires uniquement lorsque c'est utile pour faciliter la
compréhension
du code. Par exemple :
− En tête d'un bloc, pour décrire brièvement ce qu'il fait (vue d'ensemble)
− Lorsqu'on emploie une "astuce" de programmation qui risque d'être
difficile à
interpréter par la suite.

Évaluez vos compétences


Dans le tableau ci-après, indiquez pour chaque compétence, le
niveau d'acquisition que vous avez atteint.
● Non acquis : C'est encore très flou et vous avez besoin d'aide
sur le sujet.
● Partiellement acquis : Vous vous débrouillez, mais avec des hésitations.
Une
démarche par essais/erreurs vous permet en général de vous en sortir.
● Acquis et maîtrisé : Vous savez faire du premier coup et vous êtes capable
d'expliquer
à quelqu'un d'autre, de façon claire, les concepts et la démarche à
employer.
Non Partiel-
n° Compétence
acquis lement

Acquis

>3iL Ingénieurs
2022-2023 Langage C - TP
6
3iL I1 01. Cryptographie / Le chiffre de Vigenère

Maîtriser les bases du langage C 


 
1.● Créer une fonction main() 
 
2.● Déclarer des variables à l'intérieur d'une fonction 
 
3.● Écrie un traitement conditionnel (if) avec un critère composé

 
(opérateurs : et, ou, non)
4.● Insérer des commentaires dans le code. 
 
Gérer un tableau 
 
5.● Déclarer une variable de type tableau 
 
6.● Obtenir la valeur d'un élément du tableau 
 
7.● Modifier la valeur d'un élément du tableau 
 
8.● Obtenir la taille du tableau 
 
9.● Modifier la taille d'un tableau (pour l'agrandir par exemple) 
 
Gérer une boucle 
 
10.● Utiliser l'instruction for 
 
11.● Utiliser l'instruction continue 
 
12.● Utiliser l'instruction break 
 
13. Utiliser les caractères et les chaînes de caractères 
 
14.● Faire des opérations sur les caractères telles que 'A' + 3 
 
15.● Déterminer si un caractère est une lettre minuscule. 
 
16.● Convertir une lettre minuscule en lettre majuscule. 
 
17.● Déterminer la longueur d'une chaîne de caractères 
 
18.● Expliquer la différence entre les résultats obtenus par

 
strlen("bonjour") et sizeof("bonjour").
Afficher des informations avec printf() 
 
19.● Utiliser les formats %s, %c et %d 
 
20.● Utiliser \n 
 
21. Utiliser l'opérateur modulo 
 
22. Utiliser les directives #include pour qu'il n'y ait plus de warnings 
 
23. Terminer un programme en utilisant exit() 
 
24. Comprendre pourquoi la fonction main() est censée retourner un

 
entier et à quoi correspond la valeur de cet entier.
Permettre la saisie d'informations par l'utilisateur : 
 
25.● Avec la fonction fgets() 
 
26.● Avec la fonction getchar() ou getch() 
 

>3iL Ingénieurs
2022-2023 Langage C - TP
7
3iL I1 01. Cryptographie / Le chiffre de Vigenère

TP 01. Cheat sheet (antisèche)

Opérations sur les caractères. Exemples pour obtenir le caractère C :


char car1 = 'A' ;
char car2 = car1 + 2 ;
char car3 = 'A' + 2 ;
char car4 = 'F' – 3 ;

Afficher un caractère sous forme de lettre


printf( "%c", car ) ;
Afficher un caractère sous forme de nombre (valeur décimale)
printf( "%d", car ) ;
Afficher une chaîne de caractères
printf( "%s", cheine ) ;
Effectuer un saut de ligne
printf( "\n" ) ;
Afficher un texte + une chaine + 2 caractères et terminer par un saut de ligne
:
printf( "Voici un texte : %s %c %c \n", cheine, car1, car2 ) ;

Opérations sur les tableaux de caractères.


Exemple : copier le contenu de chaine1 dans chaine2
char chaine1[] = "coucou";
char chaine2[ sizeof(chaine1) ];
int i;
for ( i = 0; i < sizeof(chaine1); i++ ) {
chaine2[i] = chaine1[i];
}
int sizeof( tableau )
Retourne la taille du tableau
( c'est-à-dire l'espace qu'il occupe en mémoire, en nombre d'octets).

int toupper( int c) / int tolower( int c)


<ctype.h>
Retourne le caractère majuscule / minuscule correspondant à celui passé en
paramètre.
int isupper( int c) / int islower( int c)
<ctype.h>
Détermine si un caractère est une lettre majuscule / minuscule
(retourne zéro si c'est faux).
strupr( char* str) / strlwr( char* str)
<string.h>
Convertit en majuscules / minuscules la chaîne de caractères passée en
paramètre.
amètre.
int strlen( char* str )
<string.h>
Retourne la longueur de la chaîne (le nombre de caractères qu'elle contient
sans compter
le zéro terminal).
>3iL Ingénieurs
2022-2023 Langage C - TP
8
3iL I1 01. Cryptographie / Le chiffre de Vigenère

exit( int status )


<stdlib.h>
Termine l'exécution du programme en retournant au système la valeur passée en
paramètre (zéro = fin normale)
Exemples :
exit( EXIT_SUCCESS );
exit( EXIT_FAILURE );

fgets( char* str, int n, FILE* stream )


<stdio.h>
Lit depuis le flux (stream) une chaîne de caractères occupant au maximum n
octets (y
compris le zéro terminal), et la stocke à l'emplacement désigné par la
variable str.
Exemple :
char nom[20];
printf( "Comment t'appelles tu ? : ");
fgets( nom, sizeof(nom), stdin );
printf( "Bonjour %s \n", nom );
int getchar()
<stdio.h>
Retourne un caractère lu sur l'entrée standard (nécessite d'appuyer sur la
touche<Entrée> pour valider la saisie).
int getch()
<conio.h>
Retourne un caractère lu sur l'entrée standard (lecture immédiate, pas besoin
d'appuyer
sur la touche <Entrée>).

>3iL Ingénieurs

Vous aimerez peut-être aussi