2017-04-13 3 views
0

Ich arbeite an einem Cipher-Projekt in C-Sprache. Ich muss 9 Funktionen mit mehreren Verschlüsselungs-/Entschlüsselungszwecken schreiben. Diese Funktion soll in der Lage sein, einen Text in einer 'message.txt'-Datei zu lesen, die Nachricht zu chiffrieren/entschlüsseln (abhängig von der Benutzereingabe) und dann die Ergebnisse in eine neue' code.txt'-Datei zu schreiben, die die Funktion erstellt. Der Benutzer gibt einen Schlüssel (Schlüssel) und den Modus (Chiffre/Entschlüssler), den er wünscht, und die Funktion wird basierend auf einer anderen Funktion ausgeführt, die nach der Vigenère-Methode chiffriert/entschlüsselt. Hier ist mein Code, (einige Teile sind in Spanisch tut mir leid) zuerst ist die Funktion, die Chiffren/Entschlüssler, dann die Datei lesen/schreiben und dann die Haupt(). (IF MODE == 0 FUNKTION DECIPHERS).Datei schreiben Bugging

#include <string.h> 
#include <stdio.h> 

int vigenereCipher(char *chaine, char *key, char *code, int mode) 
{ 
    int i = 0, c = 0; 

    if (mode != 0) { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] + key[c] < 256) { 
       code[i] = chaine[i] + key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] + key[c] - 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } else { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] - key[c] < 0) { 
       code[i] = chaine[i] - key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] - key[c] + 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } 

    printf("\n %s -> %s \n", chaine, code); 
    if (*chaine == *chaine) { 
     printf("\n0\n"); 
    } else { 
     printf("\n1\n"); 
    } 
} 

int encryptTextFile(char *key, int mode) 
{ 
    char chaine[99999]; 
    char code[99999]; 
    int i; 
    FILE *archivo1, *archivo2; 

    archivo1 = fopen("message.txt", "r"); 
    archivo2 = fopen("code.txt", "w"); 

    fscanf(archivo1, "%s", chaine); 

    vigenereCipher(chaine, key, code, mode); 

    for (i = 0; i < strlen(chaine); i++) { 
     fprintf(archivo2, "%c", code[i]); 
    } 

    fclose(archivo1); 
    fclose(archivo2); 
} 

int main() 
{ 
    char key[99999]; 
    int mode; 

    printf("Enter encryption key: "); 
    gets(key); 

    printf("Enter desired mode (1 or 0): "); 
    scanf("%i", &mode); 

    encryptTextFile(key, mode); 
} 

Diese Funktion kann richtig chiffrieren/dechiffrieren, aber wenn es die Ergebnisse in der ‚Code.txt‘ zu schreiben versucht, Datei, die es nicht die gleichen chiffriert/dechiffriert Zeichen es vor gab schreibt.

Wie kann ich das korrigieren, damit die gleichen Zeichen in die Datei 'code.txt' geschrieben werden? Danke. (Bitte lassen Sie mich wissen, wenn Sie etwas ins Englische übersetzt benötigen.)

+3

In 'chiffrementVigenere 'wo enden Sie die Strings, die Sie bauen? –

+3

Ihr Code generiert 6 Compiler-Warnungen von MSVC. Drei betreffen vorzeichenbehaftete/vorzeichenlose Ganzzahlvergleiche. Man rät, dass "bekommt" veraltet ist. Zwei raten, dass Funktionen keinen Wert zurückgeben, wenn sie sollten. Bitte aktivieren Sie alle Compiler Warnungen. –

+0

'Bitte aktivieren Sie alle Compiler-Warnungen' und beheben Sie diese Probleme, bevor Sie fortfahren – KevinDTimm

Antwort

0

strlen verwendet die erste '\0', um die Länge zu bestimmen. So könnte eine verschlüsselte Kette irrtümlich um strlen gekürzt werden.

Sie benötigen also eine andere Zeichenfolgendarstellung, die Byteblöcke mit einer gespeicherten Größe berücksichtigt.

+0

Vielen Dank, ich habe diese Probleme gelöst, und auch den Fehler beim Schreiben von Dateien. –