vigenere.c 1.38 KB
#include <stdio.h>
#include<stdlib.h>
#include <ctype.h>
#include <string.h>
#include "../inc/vigenere.h"

char * message;
char * cle;
int tailleCle;


/* Fonction de chiffrement ou déchiffrement Vigenere
   Chiffre/Dechifffe le char *message avec la char *cle de taille int tailleCle
   Si int encode = 1 -> chiffrement, Si int encode = 0 -> dechiffre */
void vigenere(unsigned char *message, unsigned char *cle, int tailleCle, int encode)
{
   int iCle = 0;

   /* Parcours du message */
   for (int iMsg = 0; message[iMsg] != '\0'; iMsg++) {

      /* Si notre caractère est un caractère alphanumérique */
      if(isalpha(message[iMsg])) {
         char casse, lettreCle;

         //casse = 'A' si 'A' < message[iMsg] < 'Z'
         //casse = 'a' si 'a' < message[iMsg] < 'z'
         casse = (isupper(message[iMsg])) ? 'A' : 'a';
         lettreCle = tolower(cle[iCle]) - 'a';
         iCle = (iCle + 1) % tailleCle;

         /* On se ramène à des lettres codées dans [0:26] pour pouvoir appliqué les formules suivantes */
         message[iMsg] -= casse;
         if (encode) message[iMsg] = ((message[iMsg] + lettreCle) % 26+ 26) % 26; // CHIFFREMENT
         else message[iMsg] = ((message[iMsg] - lettreCle) % 26 + 26) % 26;       // DECHIFFREMENT

         /* On rétablie le code ascii (65 à 90 pour les majuscule, 97 à 122 pour les minuscules) */
         message[iMsg] += casse;
      }
   }
}