Chiffre de César en C - Implémentation Étape par Étape

advertisement

Chiffre de César en Programmation C est un projet fondamental que tout étudiant en programmation C devrait maîtriser. Ce tutoriel fournit une implémentation complète et fonctionnelle avec des explications détaillées de chaque composant. Pour comprendre les fondements théoriques de ce chiffrement, visitez notre Guide du Chiffre de César.

Étape 1 : Inclure les Bibliothèques Nécessaires

D'abord, nous devons inclure les bibliothèques nécessaires qui fournissent des fonctions pour les entrées/sorties, la manipulation de chaînes et les opérations sur les caractères.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

Étape 2 : Créer la Fonction de Chiffrement

La fonction de chiffrement prend une chaîne de texte, une valeur de décalage et un buffer de résultat. Elle traite chaque caractère, décalant les lettres tout en préservant les caractères non alphabétiques.

// Fonction pour chiffrer le texte avec le chiffre de César
void encrypt(char *text, int shift, char *result) {
    int i;
    int length = strlen(text);

    for (i = 0; i < length; i++) {
        char ch = text[i];

        // Chiffrer les lettres majuscules
        if (ch >= 'A' && ch <= 'Z') {
            result[i] = ((ch - 'A' + shift) % 26) + 'A';
        }
        // Chiffrer les lettres minuscules
        else if (ch >= 'a' && ch <= 'z') {
            result[i] = ((ch - 'a' + shift) % 26) + 'a';
        }
        // Garder les caractères non alphabétiques inchangés
        else {
            result[i] = ch;
        }
    }
    result[length] = '\0'; // Terminer la chaîne par null
}

Étape 3 : Implémenter la Fonction de Déchiffrement

Le déchiffrement est simplement du chiffrement avec le décalage inversé. Nous calculons le décalage inverse et utilisons notre fonction de chiffrement.

// Fonction pour déchiffrer le texte avec le chiffre de César
void decrypt(char *text, int shift, char *result) {
    // Le déchiffrement est un chiffrement avec décalage négatif
    int decryptShift = 26 - (shift % 26);
    encrypt(text, decryptShift, result);
}

Étape 4 : Construire la Fonction Principale

La fonction principale fournit une interface de menu conviviale, gère la validation des entrées et démontre à la fois le chiffrement et le déchiffrement.

int main() {
    char text[1000];
    char result[1000];
    int shift = 3; // Décalage César par défaut

    // Exemple d'utilisation
    printf("Démo du Chiffre de César\n");
    printf("Entrez le texte : ");
    fgets(text, sizeof(text), stdin);

    // Supprimer le saut de ligne s'il est présent
    if (text[strlen(text) - 1] == '\n') {
        text[strlen(text) - 1] = '\0';
    }

    // Chiffrer le texte
    encrypt(text, shift, result);
    printf("\nOriginal : %s\n", text);
    printf("Chiffré : %s\n", result);

    // Déchiffrer le texte
    decrypt(result, shift, text);
    printf("Déchiffré : %s\n", text);

    return 0;
}

Code du Programme Complet

Voici le programme complet de chiffre de César, prêt à compiler, qui combine toutes les étapes précédentes :

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// Fonction pour chiffrer le texte avec le chiffre de César
void encrypt(char *text, int shift, char *result) {
    int i;
    int length = strlen(text);

    for (i = 0; i < length; i++) {
        char ch = text[i];

        // Chiffrer les lettres majuscules
        if (ch >= 'A' && ch <= 'Z') {
            result[i] = ((ch - 'A' + shift) % 26) + 'A';
        }
        // Chiffrer les lettres minuscules
        else if (ch >= 'a' && ch <= 'z') {
            result[i] = ((ch - 'a' + shift) % 26) + 'a';
        }
        // Garder les caractères non alphabétiques inchangés
        else {
            result[i] = ch;
        }
    }
    result[length] = '\0'; // Terminer la chaîne par null
}

// Fonction pour déchiffrer le texte avec le chiffre de César
void decrypt(char *text, int shift, char *result) {
    // Le déchiffrement est un chiffrement avec décalage négatif
    int decryptShift = 26 - (shift % 26);
    encrypt(text, decryptShift, result);
}

// Fonction pour afficher le menu et obtenir le choix de l'utilisateur
int getChoice() {
    int choice;
    printf("\n=== Programme de Chiffre de César ===\n");
    printf("1. Chiffrer le texte\n");
    printf("2. Déchiffrer le texte\n");
    printf("3. Quitter\n");
    printf("Entrez votre choix (1-3) : ");
    scanf("%d", &choice);
    return choice;
}

int main() {
    char text[1000];
    char result[1000];
    int shift;
    int choice;

    printf("Bienvenue dans le Programme de Chiffre de César !\n");

    do {
        choice = getChoice();

        switch(choice) {
            case 1:
                printf("\nEntrez le texte à chiffrer : ");
                getchar(); // Vider le buffer
                fgets(text, sizeof(text), stdin);

                // Supprimer le saut de ligne s'il est présent
                if (text[strlen(text) - 1] == '\n') {
                    text[strlen(text) - 1] = '\0';
                }

                printf("Entrez la valeur de décalage (1-25) : ");
                scanf("%d", &shift);

                // Valider la valeur de décalage
                if (shift < 1 || shift > 25) {
                    printf("Valeur de décalage invalide ! Utilisation du décalage par défaut de 3.\n");
                    shift = 3;
                }

                encrypt(text, shift, result);
                printf("\nTexte original : %s\n", text);
                printf("Texte chiffré : %s\n", result);
                break;

            case 2:
                printf("\nEntrez le texte à déchiffrer : ");
                getchar(); // Vider le buffer
                fgets(text, sizeof(text), stdin);

                // Supprimer le saut de ligne s'il est présent
                if (text[strlen(text) - 1] == '\n') {
                    text[strlen(text) - 1] = '\0';
                }

                printf("Entrez la valeur de décalage utilisée pour le chiffrement (1-25) : ");
                scanf("%d", &shift);

                // Valider la valeur de décalage
                if (shift < 1 || shift > 25) {
                    printf("Valeur de décalage invalide ! Utilisation du décalage par défaut de 3.\n");
                    shift = 3;
                }

                decrypt(text, shift, result);
                printf("\nTexte chiffré : %s\n", text);
                printf("Texte déchiffré : %s\n", result);
                break;

            case 3:
                printf("\nMerci d'avoir utilisé le Programme de Chiffre de César !\n");
                break;

            default:
                printf("\nChoix invalide ! Veuillez réessayer.\n");
        }
    } while (choice != 3);

    return 0;
}

Comment Fonctionne le Programme

Le programme se compose de plusieurs composants clés qui travaillent ensemble :

  • Fonction de Chiffrement - Prend le texte d'entrée et la valeur de décalage, transforme chaque lettre en la déplaçant vers l'avant dans l'alphabet
  • Fonction de Déchiffrement - Inverse le processus de chiffrement en déplaçant les lettres vers l'arrière
  • Fonction Principale - Fournit une interface utilisateur avec système de menu pour les opérations de chiffrement/déchiffrement

Caractéristiques Clés de l'Implémentation :

  • Gère correctement les lettres majuscules et minuscules
  • Préserve les espaces, nombres et caractères spéciaux
  • Utilise l'arithmétique modulaire pour le bouclage de l'alphabet
  • Inclut la validation des entrées et la gestion d'erreurs
  • Système de menu interactif pour une utilisation conviviale
  • Gestion appropriée des chaînes avec terminaison null

Compilation et Exécution

Pour compiler et exécuter ce programme sur la plupart des systèmes, utilisez les commandes suivantes :

gcc -o caesar_cipher caesar_cipher.c
./caesar_cipher

# Sous Windows :
gcc -o caesar_cipher.exe caesar_cipher.c
caesar_cipher.exe

Exemple de Sortie du Programme

Voici ce que vous verrez en exécutant le programme :

Bienvenue dans le Programme de Chiffre de César !

=== Programme de Chiffre de César ===
1. Chiffrer le texte
2. Déchiffrer le texte
3. Quitter
Entrez votre choix (1-3) : 1

Entrez le texte à chiffrer : Bonjour Monde !
Entrez la valeur de décalage (1-25) : 3

Texte original : Bonjour Monde !
Texte chiffré : Erqmrxu Prqgh !

Gestion de la Mémoire et Sécurité

Cette implémentation utilise des tableaux de caractères de taille fixe pour éviter la complexité de l'allocation dynamique de mémoire. Le programme inclut une vérification appropriée des limites et une terminaison null des chaînes pour prévenir les débordements de buffer. Pour un usage en production, considérez l'implémentation de l'allocation dynamique de mémoire pour gérer des textes plus volumineux.

Considérations de Sécurité

Rappelez-vous que le chiffre de César est un chiffrement de substitution simple et fournit une sécurité minimale. Il est facilement cassable par analyse de fréquence ou attaques par force brute. Cette implémentation est destinée à des fins éducatives et à la compréhension des concepts cryptographiques de base.

Objectifs d'Apprentissage

Implémenter le chiffre de César en C enseigne plusieurs concepts fondamentaux de programmation :

  • Manipulation de chaînes et gestion de tableaux de caractères
  • Arithmétique de caractères ASCII et conversion de types
  • Arithmétique modulaire et opérations mathématiques
  • Conception de fonctions et passage de paramètres
  • Validation des entrées et gestion d'erreurs
  • Structure de programme dirigée par menu
  • Fondements de la cryptographie et sensibilisation à la sécurité

Améliorations Possibles

Cette implémentation de base peut être étendue de plusieurs façons :

  • Opérations d'E/S de fichiers pour chiffrer/déchiffrer des fichiers texte
  • Support des caractères Unicode et alphabets internationaux
  • Implémentation d'autres chiffrements classiques (Vigenère, ROT13)
  • Déchiffrement par force brute pour valeurs de décalage inconnues
  • Support d'arguments en ligne de commande pour traitement par lots
  • Interface graphique utilisateur utilisant des bibliothèques comme GTK+

Résumé

Cette implémentation du chiffre de César en C démontre des concepts fondamentaux de programmation tout en introduisant des principes cryptographiques de base. Le code est bien structuré, inclut une gestion appropriée des erreurs et fournit une base solide pour comprendre à la fois la programmation C et les techniques élémentaires de chiffrement. Pratiquer avec cet exemple renforcera votre compréhension de la manipulation de chaînes, des opérations mathématiques et de la conception de programmes en C.