2011-09-06 2 views
-1

J'ai essayé de travailler sur une routine de chiffrement très simple, il devrait fonctionner comme ceci:

Génération aléatoire ASCII

- Générer un aléatoire clé de caractères ASCII (Juste une permutation de la table ascii
- Pour chaque caractère dans le fichier à chiffrer, obtenez sa représentation décimale (X), puis remplacez-le par le caractère de l'index X à la clé.

Le problème est qu'il corrompt certains fichiers et je ne sais pas pourquoi.
Toute aide serait appréciée.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
int main() 
{ 
    int temp,used[256]; 
    char *key,*mFile; 
    long i,fSize; 

    memset(used,0,sizeof(used)); 

    srand(time(NULL)); 

    FILE *pInput = fopen("Input.in","rb"); 
    FILE *pOutput = fopen("Encrypted.out","wb"); 
    FILE *pKeyOutput = fopen("Key.bin","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyOutput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 
    key = (char*)malloc(255); 
    for(i=0;i<256;i++) 
    { 
     temp = rand()%256; 
     while(used[temp]) 
      temp = rand()%256; 
     key[i] = temp; 
     used[temp] = 1; 
    } 
    fwrite(key,1,255,pKeyOutput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 

    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     fputc(key[temp],pOutput); 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyOutput); 
    free(mFile); 
    free(key); 
    return 0; 
} 



La routine Décryptage:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int temp,j; 
    char *key,*mFile; 
    long i,fSize; 

    FILE *pKeyInput = fopen("key.bin","rb"); 
    FILE *pInput = fopen("Encrypted.out","rb"); 
    FILE *pOutput = fopen("Decrypted.out","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyInput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 

    key = (char*)malloc(255); 
    fread(key,1,255,pKeyInput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 
    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     for(j=0;j<256;j++) 
     { 
      if(key[j]==temp) 
       fputc(j,pOutput); 
     } 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyInput); 
    free(mFile); 
    free(key); 
    return 0; 
} 
+2

pas de contrôles, pas de commentaires, pas d'impression de débogage -> code incorrect -> le comportement peut être imprévisible – pmod

+0

De quels fichiers est-il corrompu? – Chriszuma

+0

@pmod Le code est simple, aucun commentaire nécessaire. –

Répondre

2

Assurez-vous d'utiliser unsigned char; Si char est signé, les choses vont mal tourner lorsque vous traitez les caractères dans la plage 0x80..0xFF. Plus précisément, vous accéderez à des index négatifs dans votre «table de mappage».

Bien sûr, à proprement parler, ASCII est un jeu de 7 bits et tout caractère hors de la plage 0x00..0x7F n'est pas ASCII. Vous n'allouez que 255 octets, mais vous remplacez un octet au-delà de ce que vous allouez. Vous n'attribuez que 255 octets. C'est un débordement de tampon de base; vous invoquez un comportement non défini (ce qui signifie que tout peut arriver, y compris la possibilité qu'il semble fonctionner correctement sans causer de problèmes) sur certaines machines.

Un autre problème est que vous écrivez des correspondances pour 255 des 256 codes d'octets possibles, ce qui est déroutant. Que se passe-t-il avec l'autre valeur d'octet?

Bien sûr, puisque vous écrivez le mapping de 256 octets dans le fichier 'encrypted', ce sera un jeu d'enfant à décoder; la sécurité dans ce système est négligeable. Cependant, en tant qu'exercice de programmation, il a encore un certain mérite.

Il n'y a pas de raison de slurper le fichier entier, puis de l'écrire octet par octet. Vous pouvez parfaitement le lire octet par octet ainsi que l'écrire octet par octet. Ou vous pouvez slurp le fichier entier, le mapper sur place, puis écrire le fichier entier en une seule fois. La cohérence est importante dans la programmation.

+0

Peut vouloir modifier si ... –

+0

Merci beaucoup, ça marche bien maintenant. –

+0

Changé la taille de la mémoire tampon à 256 (Que diable ai-je pensé^_ ^) –

Questions connexes