Bonjour à tous,

je suis en train de coder une partie de classe permettant de crypter/décrypter des données de manière très basique avec un simple XOR.

Pour se faire je test sur un simple fichier pour commencer ( et non directement sur des frames réseau via liaison TCP/IP ).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
void C_PWI_Engine::Decrypter(AnsiString Nom_Fichier)
{
	FILE *Fich;

	Fich = fopen(Nom_Fichier.c_str(),"r+b");
	unsigned long int SizeOfBuffer = 4096;
	unsigned __int64 *Int64_Buff;
	unsigned __int64 Int64_Clef=0x1122334455667788;
	char *Buffer;
	Buffer = new char[SizeOfBuffer];

	for (unsigned long int i = 0; i < Filesize(Fich); i += SizeOfBuffer)
	{
		fseek(Fich,i,SEEK_SET);
		fread(Buffer,SizeOfBuffer,1,Fich);

		/* Crypte ou decrypte ( involutif ) */

		for (unsigned long int j = 0; j < SizeOfBuffer; j++)
		{
			Int64_Buff = (unsigned __int64*) ((void) (Buffer+j));
			*Int64_Buff = *Int64_Buff ^ Int64_Clef;
		}

		/* ecrit vers fichier destination */
		fseek(Fich,i,SEEK_SET);
		fwrite(Buffer,SizeOfBuffer,1,Fich);
	}
	fclose(Fich);
	delete Buffer;
}
Problème : c'est lent.

Du coup je me suis dit qu'en déclarant un __int64 je devrais théoriquement pouvoir utiliser toute la puissance du processeur 64bits et de son opérateur XOR ( qui doit être si mes souvenirs sont bons plus rapide qu'un ADD ou toute autre opération ).

sauf que j'ai un soushi avec la ligne en rouge.
Comment peut-on faire pointer un __int64 sur un tableau d'octets (de char) ?
Je sais que c'est possible car je l'ai déjà fait par le passé mais je ne me rappelle plus de la syntaxe exacte ( reinterpret_cast ? )


Seconde question : l'utilisation d'un __int64 est-elle un plus ou le compilateur va-t-il de toute façon reconvertir derrière (cas d'une machine 32bits) ??

Merci d'avance pour vos réponses et vos conseils sur l'algorithme que vous utiliseriez pour avoir une vitesse maximale !