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 ).
Problème : c'est lent.Code:
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; }
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 !