2017-05-15 2 views
0

J'ai développé un algorithme de chiffrement qui prend des caractères par des textes de caractères à partir d'un fichier .txt et les crypte, puis les réécrit dans un autre fichier .txt. Le problème est lorsque je lis le fichier crypté, un caractère comme signe de flèche agit comme EOF et ma boucle se termine avant l'EOF d'origine. Voici mon code:Pourquoi la variable char non signée contient-elle EOF?

static void ECB_ENCRYPTION(void) 
{ 
    uint8_t i = 0, j = 0, c, buf1[16] 


    uint8_t plain_text[16]; 

    // File pointers for file operations. 
    FILE *f, *f1; 


    // Encrypts the file [plaintext.txt]. 
    f = fopen("plaintext.txt", "r"); 
    f1 = fopen("ciphertext.txt", "w"); 
    while(1) 
    { 
     i = 0; 
     while(i < 16) 
     { 
      c = getc(f); 
      if(feof(f)) 
      { 
       break; 
      } 
      else 
      { 
       plain_text[i] = c; 
       ++i; 
      } 
     } 

     if(i != 16) 
     { 
      while(i < 16) 
      { 
       plain_text[i] = ' '; 
       ++i; 
      } 
     } 

     // Encrypts plain text. 
     AES128_ENCRYPT(plain_text, buf1); 

     i = 0; 
     while(i < 16) 
     { 
      putc(buf1[i], f1); 
      ++i; 
     } 

     if(feof(f)) 
      break; 

    } 

    fclose(f); 
    fclose(f1); 
} 

static void ECB_DECRYPTION(void) 
{ 

    uint8_t i = 0, j = 0, c, buf1[16]; 

    uint8_t cipher_text[16]; 

    // File pointers for file operations. 
    FILE *f, *f1; 

    // Encrypts the file [plaintext.txt]. 
    f = fopen("ciphertext.txt", "r"); 
    f1 = fopen("decryptedtext.txt", "w"); 
    while(1) 
    { 
     i = 0; 
     while(i < 16) 
     { 
      c = getc(f); 
      if(feof(f)) 
      { 
       break; 
      } 
      else 
      { 
       cipher_text[i] = c; 
       ++i; 
      } 
     } 

     if(feof(f)) 
      break; 

     // Decrypts cipher text. 
     AES128_DECRYPT(cipher_text, buf1); 

     i = 0; 
     while(i < 16) 
     { 
      putc(buf1[i], f1); 
      ++i; 
     } 

    } 

    fclose(f); 
    fclose(f1); 
} 
+1

double possible de [Représentant EOF dans le code C?] (Http://stackoverflow.com/questions/12389518/representing-eof-in-c-code) – Badda

+2

"signe de flèche" ne ressemble pas à texte. Peut-être devriez-vous traiter le fichier crypté comme binaire et le "fopen" avec "" wb "' et '" rb "'. –

+1

Un exemple des entrées causant les problèmes aiderait. –

Répondre

0

L'utilisation de uint8_t c plutôt que int c a obscurci le vrai problème: l'ouverture du fichier en mode binaire par rapport au mode texte. @Klas Lindbäck

int c aurait été mieux. Toujours l'utilisation de uint8_t; c = getc(f); if(feof(f)) OP était presque correcte. Il échoue lorsqu'une erreur de lecture se produit.

static void ECB_DECRYPTION(void) { 
    uint8_t cipher_text[16]; 
    uint8_t buf1[16]; 

    FILE *f = fopen("ciphertext.txt", "rb"); // add 'b' 
    assert(f); 
    FILE *f1 = fopen("decryptedtext.txt", "wb"); // add 'b' 
    assert(f1); 
    while(1) 
    { 
     int c; 
     for (unsigned i=0; i<16; i++) { 
      c = getc(f); 
      if (c == EOF) break; 
      cipher_text[i] = (uint8_t) c; 
     } 

     if(c == EOF) break; // exit loop on end-of-file or input error 

     AES128_DECRYPT(cipher_text, buf1); 

     for (unsigned i=0; i<16; i++) { 
      putc(buf1[i], f1); 
     } 
    } 

    fclose(f); 
    fclose(f1); 
} 
+0

Il a également été utile ... merci ... a ... Beaucoup. –

0

C'est parce qu'un caractère ascii crypté peut obtenir une représentation binaire, y compris NUL, EOF,^Z ou autre. Votre fichier crypté résultant n'est donc plus un fichier texte. C'est maintenant un fichier binaire. Lorsque vous créez le fichier crypté, ouvrez-le avec "wb" et, lorsque vous le lisez, ouvrez-le avec "rb". En outre, utilisez les fonctions binaires pour écrire (fwrite) et lire (fread), pas fputc et fegtc.

+0

Un 'uint8_t c' ne peut pas avoir la valeur de' EOF', un nombre négatif – chux