Cryptage Vigenère

Fermé
Takago Messages postés 1 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 7 décembre 2012 - 7 déc. 2012 à 16:37
ReganDryke Messages postés 13 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 22 février 2013 - 8 déc. 2012 à 22:58
Bonjour,
dans le cadre d'un projet de ma première année de BTS, je dois réaliser un mini-projet qui consiste à Crypter et Décrypter un texte avec la méthode Vigenère.
Voici mon code :

// Déclaration des variables globales
char ChaineCaractere [255]="";
char ChaineCryptee [255]="";
char ClefVigenere [255] = "bonjour";
int z;
int x;
strcpy (ChaineCaractere,MFichier->Text.t_str());
int TailleChaine=strlen(ChaineCaractere); // calcul taille buffer non crypté
int TailleChaine1=strlen(ClefVigenere);
for( z=0; z<TailleChaine; z++)
{

for(x=0; x<TailleChaine1; x++)


ChaineCryptee[z]=ChaineCaractere[z]+ClefVigenere[z];


}
ChaineCryptee[z]='\0';
MFichier->Clear();
MFichier->Lines->Add(ChaineCryptee);

Je voudrais ne pas avoir à déclarer plusieurs fois ma clé si la chaine de caractères à crypter et plus longue que la clé. Vu que ma clé ne fait que 7 caractères, cela ne crypte que les 7 premiers caractères de mon texte.

D'avance merci pour votre réponse.

1 réponse

ReganDryke Messages postés 13 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 22 février 2013 6
8 déc. 2012 à 22:58
Facile tu n'as qu'à tester si ton message en clair est plus long que ta clef. S'il est effectivement plus long il te faut juste concatener ta clef avec elle même.

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string clef = "bonjour";
    string messageClair = "Salut a tous. Ceci est un test.";
    while (clef.length()<messageClair.length())
    {
        clef +=clef;
        cout << messageClair <<endl;
        cout << clef <<endl<<endl;
    }
    cout << messageClair <<endl;
    cout << clef <<endl;
    return 1;
}


Cependant au bout d'un certain nombre de repetition ta clef depassera de beaucoup la taille de ton message. Tu peux regler cela en utilisant seulement un bout de ta string en memorisant sa longeur initiale et en faisant bon usage de la methode substr.

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string clef = "bonjour";
    string messageClair = "Salut a tous. Ceci est un test.";
    int tailleClefOriginale = clef.length(); 
//string.length() te permet d'obtenir la longeur d'une string.
    while (clef.length()<messageClair.length()) 
//tu testes si la clef est plus petite que le message
    {
        clef += clef.substr(0,tailleClefOriginale); 
//Tu concatene la clef avec la clef originale. strind.substr(int,int) permet de            
//recuperer un bout de chaine le premier int definnissant la position a partir de 
//laquelle on recupere et le second le nombre de caractere recuperer (s'il n'est 
//pas defini il recupere du caractère defini comme depart a la fin de la chaine).  
        cout << messageClair <<endl;
        cout << clef <<endl<<endl;
    }
    cout << messageClair <<endl;
    cout << clef <<endl;
    return 1;
}
0