vigenere.c
1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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;
}
}
}