Crypter du rtf avec l'algo de vigenere

Description

Voici un petit programme qui met en oeuvre l'algorithme de cryptage de Vigenere. Ce programme ne crypte que du RTF (pour l'instant, pour mes besoins perso j'ai du le créer uniquement pour du RTF).

Certaines améliorations doivent être possible (codage du cractère d'échappement '\n' par exemple).

Pour les tests, je joins un fichier .rtf.

Toute remarque constructive est évidemment la bien venue.

A+

Source / Exemple :


////  LE COEUR DU PROGRAMME : /////////////////////////////////////////////////////////

////////////////  FONCTION DE CRYPTAGE / DECRYPTAGE  //////////////////////////////////

CString __fastcall CFonctCryptage::CrypterUneChaine(const CString LaChaine, const CString LaClef) 
{
CString chCrypte("");
CString chif("");

unsigned long LongueurDeLaChaine=LaChaine.GetLength();
unsigned long LongueurDeLaClef=LaClef.GetLength();
unsigned long I=0;
int OffsetTemp=0;;
CString CaractereChaineCourant("");
CString CaractereCleCourant("");

while(I<LongueurDeLaChaine)
{

	CaractereCleCourant=LaClef.GetAt(I%LongueurDeLaClef);
	CaractereChaineCourant=LaChaine.GetAt(I%LongueurDeLaChaine);
// Ce caractère d'échappement '\n' est interprété comme un
// '/' et un 'n' donc 2 caractères Je le remplace par un @
	if(CaractereChaineCourant=='\n' ||CaractereChaineCourant=="@" )  
	{
		chCrypte+="@";
	}
	else 
	{	
		int LOffsetTemp = LOffsetCrypter(	OffsetDuChar(CaractereCleCourant),
						(OffsetDuChar(CaractereChaineCourant)));

		chCrypte+=CaractereDeLOffset(LOffsetTemp);
	}
	I++; 
	//Pour afficher le nombre de caractères en cours de chiffrage :
	chif.Format("%d",I);
	pMonParent->AfficherChiffre(chif);

}

return chCrypte;
}

CString __fastcall CFonctCryptage::DecrypterUneChaine(const CString LaChaine, const CString LaClef)
{

CString chCrypte("");
CString chif("");

unsigned long LongueurDeLaChaine=LaChaine.GetLength();
unsigned long LongueurDeLaClef=LaClef.GetLength();
unsigned long I=0;
int OffsetTemp=0;;
CString CaractereChaineCourant("");
CString CaractereCleCourant("");

	while(I<LongueurDeLaChaine)
	{

		CaractereCleCourant=LaClef.GetAt(I%LongueurDeLaClef);
		CaractereChaineCourant=LaChaine.GetAt(I%LongueurDeLaChaine);
		
		if(CaractereChaineCourant=="@" )
			chCrypte+="\n";

		else 
		{		
			int LOffsetTemp = LOffsetDecrypter(	OffsetDuChar(CaractereCleCourant),
							(OffsetDuChar(CaractereChaineCourant)));

			chCrypte+=CaractereDeLOffset(LOffsetTemp);
		}
		
		I++; 
		//Pour afficher le nombre de caractères en cours de déchiffrage
		chif.Format("%d",I);
		pMonParent->AfficherChiffre(chif);
	}
	return chCrypte;

}
////////////////  FIN DE FONCTION DE CRYPTAGE / DECRYPTAGE  //////////////////////////////////
/********************************************************************************************/

///////////////// FONCTIONS DE CALCUL D'OFFSET DANS LE TABLEAU DE VIGNERE ////////////////////

int __fastcall CFonctCryptage::OffsetDuChar(CString LeCaractere)
{
	int Offset=0;
/////////////////
	// Le modulo correspondant au nombre d'éléments du tableau de Vigenère
	// La variable I permet de gagner un peu de temps dans la boucle
	int I=sizeof(TableChaine)/sizeof(char*);
///////////////////////

	while(LeCaractere!=(CString)TableChaine[Offset%I] && Offset<=I)
	{
		Offset++;
	}
	return Offset;

}

int __fastcall CFonctCryptage::LOffsetCrypter(int OffsetCle,int OffsetChar)
{

	int I=(OffsetCle+OffsetChar)%(sizeof(TableChaine)/sizeof(char*));
	return I;
}

int __fastcall CFonctCryptage::LOffsetDecrypter(int OffsetCle,int OffsetChar)
{

	int I=(OffsetChar-OffsetCle);
	if(OffsetCle>OffsetChar)
		I=I+(sizeof(TableChaine)/sizeof(char*));

	return I;
}

CString __fastcall CFonctCryptage::CaractereDeLOffset(int Offset)
{
	return TableChaine[Offset];
}

///////////////// FIN FONCTIONS DE CALCUL D'OFFSET DANS LE TABLEAU DE VIGNERE ////////////////////

Codes Sources

A voir également

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.

Du même auteur (cs_thierry la fronde)