Chiffrement C: Chiffre de Vigenère

Soyez le premier à donner votre avis sur cette source.

Vue 1 624 fois - Téléchargée 171 fois

Description

[Version avec image de capture qui remplace celle du 01.01.2018]

Bonjour,

Les deux premiers articles sur le chiffrement présentent des codes peu utilisables, car chaque caractère y est traduit de manière fixe (permutation).
L'idée suivante est d'utiliser, en plus du caractère à traduire, sa position dans le fichier.
Cette méthode sera plus "approfondie" dans le prochain article "Chiffrement D: Position".

Le célèbre "Chiffre de Vigenère" (1586), basé sur l'alphabet fixe "ABCDEFGHIJKLMNOPQRSTUVWXYZ", utilise ce procédé associé à une clé.
 

Méthode classique

En fait, chaque caractère subit un décalage variable cyclique sur la clé.
Beaucoup de codes proposent de simuler le processus de l'époque en utilisant la table de Vigenère.
Mais, comme le montre WikipédiA: Chiffre de Vigenère sous Principe mathématique,
on peut faire beaucoup plus "simplement" et réduire le code à quelques instructions (► Vigenere.cpp):
char Cle[]="MUSIQUE"; // Formé de caractères de 'A' à 'Z' uniquement !
char Ori[]="J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE";
char Cry[100],Dec[100]; // Au moins aussi longs que Ori
int nCle=strlen(Cle),nTxt=strlen(Ori);

void Crypter() { // Ori ==> Cry
  for (int i=0,k=-1; i<nTxt; ++i) {
    int c=(int)Ori[i];
    Cry[i]=((c<'A')||(c>'Z')) ? c : 'A'+(c+Cle[(++k)%nCle])%26;
  } Cry[nTxt]=0;
}

void Decrypter() { // Cry ==> Dec
  for (int i=0,k=-1; i<nTxt; ++i) {
    int c=(int)Cry[i];
    Dec[i]=((c<'A')||(c>'Z')) ? c : 'A'+(78+c-Cle[(++k)%nCle])%26;
  } Dec[nTxt]=0;
}

void main() {
  printf("Alphabet: A..Z; Clef: %sn",Cle);
  printf("Texte original: %sn",Ori);
  Crypter();
  printf("Texte crypte  : %sn",Cry);
  Decrypter();
  printf("Texte decrypte: %sn",Dec);
  getchar();
}
Pour faciliter la lecture, choisissons le même exemple que Wikipédia:
Alphabet: A..Z; Clef: MUSIQUE
Texte original: J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE
Texte crypte  : V'UVWHY IOIMBUL PM LSLYI XAOLM BU NAOJVUY
Texte decrypte: J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE
qui correspond au test proposé.
 

Méthode voisine

On obtient un code encore un peu plus simple en "étalant" la clé cycliquement sur tous les caractères du message original.
Cela permet de remplacer la variable k directement par i (► VigenereA.cpp):
void Crypter() { // Ori ==> Cry
  for (int i=0; i<nTxt; ++i) {
    int c=(int)Ori[i];
    Cry[i]=((c<'A')||(c>'Z')) ? c : 'A'+(c+Cle[i%nCle])%26;
  } Cry[nTxt]=0;
}

void Decrypter() { // Cry ==> Dec
  for (int i=0; i<nTxt; ++i) {
    int c=(int)Cry[i];
    Dec[i]=((c<'A')||(c>'Z')) ? c : 'A'+(78+c-Cle[i%nCle])%26;
  } Dec[nTxt]=0;
}
L'output montre que le cryptage est différent:
Alphabet: A..Z; Clef: MUSIQUE
Texte original: J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE
Texte crypte  : V'SLELI YUWKNID DI LEPCG JIYFY TQ NAOJVUY
Texte decrypte: J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE


Je n'ai pas introduit cette méthode dans le programme composé de 3 fenêtres "Edit", car il sera compris dans le prochain article.

Bonne lecture ...

 

Liens

WikipédiA: Chiffre de Vigenère
CodeS-SourceS: Chiffrement A: Décalage
CodeS-SourceS: Chiffrement B: Permutation
CodeS-SourceS: Cryptage/decryptage vigenere
CodeS-SourceS: Chiffrement de vigenere
Ce dernier présente un code encore plus simple, car il ne tient pas compte de l'alphabet "cyclique". Le message crytpté s'écrit donc avec des caractères hors de 'alphabet 'A'..'Z'.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de William VOIROL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.