Solution de Theo2M pour À l'aise

intro crypto symétrique

13 octobre 2026

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;
}