Table des matières
Introduction
En lisant le principe du chiffrement de Vigenère sur Wikipedia, on peut penser aux points de code Unicode ou ASCII. En effet, les points de code des 26 lettres de l’alphabet se trouve entre 65 et 90 pour les lettres majuscule. Pour les minuscule il suffit de rajouter 32 au point de code de leur majuscule.
Solution
Le type primitif ‘char’ du langage de programmation C représente un charactère ASCII. On peut donc utiliser ce principe pour décoder un message chiffré avec la méthode du chiffre de Vigenère.
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv){
// Construction de la table de Vigenère
int table[26][26];
for (int i = 0; i < 26; i++){
for (int j = 0; j < 26; j++){
table[i][j] = (int)('A') + (i + j)%26;
// printf("%c ", table[i][j]);
}
// printf("\n");
}
char* decode = "Gqfltwj emgj clgfv ! Aqltj rjqhjsksg ekxuaqs, ua xtwk"
" n'feuguvwb gkwp xwj, ujts f'npxkqvjgw nw tjuwcz"
" ugwygjtfkf qz uw efezg sqk gspwonu. Jgsfwb-aqmu f"
" Pspygk nj 29 cntnn hqzt dg igtwy fw xtvjg rkkunqf.";
char* cle = "FCSC";
// Parcours et décodage du message
int indice = 0;
int cpt = 0;
int icol;
while(decode[indice] != '\0'){
if ('A' <= decode[indice] && decode[indice] <= 'Z'){
icol = 0;
// La recherche s'effectue dans la ligne dont l'indice est cle[cpt] - 'A' de la table
// Condition d'arrêt : on trouve la lettre codé à la colonne à l'indice icol
while(table[cle[cpt] - 'A'][icol] != decode[indice]){
icol++;
}
// La lettre décodé est donc la icol lettre après 'A'
printf("%c", 'A' + icol);
// Indice de la prochaine lettre de la clé utilisé pour le chiffrement
cpt = (cpt+1)%4;
}else if (('a' <= decode[indice] && decode[indice] <= 'z')){
icol = 0;
// 32 symbole entre une lettre majuscule et minuscule
while(table[cle[cpt] - 'A'][icol] != (decode[indice] - 32)){
icol++;
}
printf("%c", 'a' + icol);
cpt = (cpt+1)%4;
}
else{
// Ignore decode[indice] si ce n'est pas une lettre
printf("%c", decode[indice]);
}
indice++;
}
printf("\n");
return EXIT_SUCCESS;
}