2010-08-03 6 views
0

Je rencontre un problème lors du chiffrement de certaines données dans le fichier. J'utilise simple xor pour ça. laisse dire que j'ai cette struct:Problème de chiffrement de fichier binaire

struct MyFile{ 
char fileName[128]; 
int account; 
float balance;}; 

sauver en tant que fichier binaire fonctionne correctement, mais quand je l'utilise XOR pour crypter le nom du fichier dans le struct et enregistrez le struct HD puis lire la struct et déchiffrer le nom du fichier ne montre pas les caractères correctement. J'utilise cette fonction simple pour le but de cryptage/décryptage.

static void Codec(const char *key,int keySize,char* in,char *result,int length) 
{ 
    for(int i=0;i<length;i++) 
     result[i]=in[i]^key[i%keySize]; 
} 

Notez que lorsque je crypte le nom de fichier et le décrypte directement en mémoire, le résultat est correct. qu'est-ce que je manque comme pourquoi est-il changé quand sauvegardé sur le disque dur. Veuillez répondre au plus tôt et au plus tôt ...

+3

Vous ne pouvez pas vraiment utiliser le Étiquette de 'cryptage' lorsque vous posez des questions sur une question XOR ... Cela prend à peu près 0,0001 secondes pour que n'importe quel type connaisse votre 'clé'. –

+1

Comment écrivez-vous/lisez-vous le fichier? Et @ Remus, il semble qu'il utilise un pad une fois, puisque son code utilise un flot de clés. C'est techniquement sécurisé tant qu'il ne réutilise pas la clé.EDIT: oh, sauf s'il utilise une clé plus courte que le fichier. Alors oui, ça va être ridiculement facile à comprendre – Xzhsh

+0

Essayez xor'ing avec des zéros pour la clé - est-ce que votre algo fonctionne? –

Répondre

1

Notez que vous devez ouvrir les fichiers mode binaire ("rb"/"wb" au lieu de "r"/"w" pour fopen). Les implémentations de Windows C en particulier ont des problèmes en ce qui concerne la conversion \n < ->\r\n.

Il est également recommandé d'utiliser unsigned char s pour les opérations arithmétiques et binaires; tout sauf les caractères signés en complément de 8 bits peut causer des problèmes (ce qui, accordé, la plupart des implémentations utilisent et pourrait ne pas causer de problème avec le chiffrement XOR symétrique, mais il est toujours prudent d'être prudent.)

2

D'abord, déterminez si les données sont effectivement modifiées lors de leur écriture sur le disque. Demandez à votre programme d'impression la chaîne dans ces quatre endroits:

  1. Avant de le chiffrer
  2. Après le cryptage, mais avant de l'écrire sur le disque
  3. Après l'avoir lu à partir du disque, mais avant décryptant
  4. Après le décryptage

Les résultats de # 2 et # 3 sont-ils les mêmes? Si c'est le cas, le fichier n'est pas modifié pendant le transfert sur le disque et retour.

Si # 2 et # 3 sont différents, essayez d'écrire la chaîne non cryptée sur le disque et de la relire. Est-ce que cela fonctionne avec succès?

Écrivez une seule structure de ce type dans un fichier et examinez le contenu du fichier dans un éditeur hexadécimal. A quoi ressemble le fichier lorsqu'il est sur le disque?

Publiez également votre code d'écriture sur disque et de lecture à partir du disque, une partie du problème peut s'y trouver.

2

Vous devez ouvrir le fichier en mode binaire. Si vous utilisez CI/O (comme je le fais normalement) cela signifie

FILE *input_file = fopen(input_file_name, "rb"); 
FILE *output_file = fopen(output_file_name, "wb"); 

Si au contraire, vous avez été trompé en utilisant les flux de C cela signifie

std::ifstream input_file(input_file_name, ios::in | ios::binary); 
std::ofstream output_file(output_file_name, ios::out | ios::binary);