One Time Pad - Fehler



  • Hi zusammen!

    Wie vielleicht die Überschrift vermuten lässt, geht es um das One-Time-Pad Verfahren. Bei meinem unten stehenden Programm wird beim Verschlüsseln das Passwort mit dem Klarinhalt addiert. Beim Entschlüsseln wird das Passwort vom verschlüsselten Inhalt subtrahiert.

    Nun ist aber die entschlüsselte Datei ungleich der Originaldatei.
    Wo liegt der Fehler?

    main.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    const int MaxIndex=1000;
    const int SHIFT=256;
    
    #include "FuncCrypt.h"
    #include "FuncEncrypt.h"
    
    void main() {
    
        time_t t;
        time(&t);
    
        srand((unsigned int)t);
    
        int MI=0;
    
        char MC[MaxIndex];
    
        printf("choice");
        printf("\n");
        printf("1 - Crypt");
        printf("\n");
        printf("2 - Encrypt");
        printf("\n");
    
        for(MI=0;MI<=3;++MI) {
    
            MI=0;
    
            scanf("%s",MC);
    
            if(MC[0]=='1') {
    
                printf("Crypt\n");
    
                FuncCrypt();
    
                MI=4;
    
            } /* if(MC[0]=='1') */
    
            if(MC[0]=='2') {
    
                printf("Encrypt\n");
    
                FuncEncrypt();
    
                MI=4;
    
            } /* if(MC[0]=='2') */
    
        } /* for(MI=0;MI<=3;++MI) */
    
        getchar();
    
    } /* void main() */
    

    FuncCrypt.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    extern MaxIndex;
    extern SHIFT;
    
    void FuncCrypt() {
    
    	/*  */
    
    	FILE *FFileA;
        FILE *FFileB;
        FILE *FFileC;
    
        char FCA[MaxIndex];
        char FCB[MaxIndex];
        char FCC[]={'p','a','s','s','w','o','r','d','.','t','x','t','\0'};
    
        int FIA=0;
        int FIB=0;
        int FIC=0;
        int FIPass=0;
    
        unsigned long int FLIA=0;
    
        printf("Input FileName\n");
    
        for(FIA=0;FIA<=3;++FIA) {
    
            FIA=0;
    
            for(FIC=0;FIC<=MaxIndex;++FIC) {
    
                FCA[FIC]='\0';
    
            }
    
            scanf("%s",FCA);
    
            FFileA = fopen (FCA, "rb");
    
            if(FFileA == NULL) {
    
                printf("file can not open.\n");
    
        	} else {    
    
                printf("Output FileName\n");
    
                scanf("%s",FCB);
    
                FFileB = fopen(FCB,"a+b");
    
                if(FFileB == NULL) {
    
                    printf("file can not open.\n");
    
                } else {
    
                    printf("Output FileName open\n");
    
                    FFileC = fopen(FCC,"a+b");
    
                    if(FFileC == NULL) {
    
                        printf("file can not open.\n");
    
                    } else {
    
                        printf("Password FileName open\n");
    
                        printf("%s",FCC);
    
                        printf("\n");
    
                        while((FIB = fgetc(FFileA))!=EOF) {
    
                            /*
                            Loop
                            - Read File
                            - Generate Password
                            - Crypt File Data
                            - Save password
                            - Write File
                            */
    
                            FIPass = rand() % SHIFT;
    
                            printf("Password\n");
                            printf("%i", FIPass);
                            printf("\n");
    
                            printf("Input\n");
                            printf("%i", FIB);
                            printf("\n");
    
                            FIB = FIB + FIPass;
    
                            if(FIB>SHIFT) {
    
                                FIB = FIB - SHIFT;
    
                            } /* if(FIB>SHIFT) */
    
                            printf("Input\n");
                            printf("%i", FIB);
                            printf("\n");
    
                            fprintf(FFileB,"%c",FIB);
    
                            fprintf(FFileC, "\r\n");
    
                            fprintf(FFileC,"%i",FIPass);
    
                            fprintf(FFileC, "\r\n");
    
                        } /* while((FIB = fgetc(FFileA))!=EOF) */
    
                        FIA = 5;
    
                        fclose(FFileC);
    
                    } /* } else { */
    
                } /* } else { */
    
                fclose(FFileB);
    
            } /* } else { */
    
            fclose(FFileA);
    
        } /* for(FIA=0;FIA<=3;++FIA) */
    
    } /* void FuncCrypt() */
    

    FuncEncrypt.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    extern MaxIndex;
    extern SHIFT;
    
    void FuncEncrypt() {
    
    	FILE *FFileD;
        FILE *FFileE;
        FILE *FFileF;
    
        char FCE[MaxIndex];
        char FCF[]={'p','a','s','s','w','o','r','d','.','t','x','t','\0'};
        char FCG[]={'e','n','c','r','y','p','t','.','t','x','t','\0'};
        char FCH[]={'0','1','2','3','4','5','6','7','8','9'};
    
    	int FID=0; /* temporaer Variable - input - file */
        int FIE=0; /* temporaer Variable - input - password */
        int FIF=0; /* loop Variable */
        int FIG=0; /* loop Variable */
        int FIH=0; /* Password */
        int FII=0; /* Loop Variable - Password */
    
        for(FIF=0;FIF<=3;++FIF) {
    
            FIF=0;
    
            printf("input file\n");
    
            scanf("%s",FCE);
    
            FFileD = fopen (FCE, "rb");
    
            if(FFileD == NULL) {
    
                printf("file can not open.\n");
    
            } else {
    
                printf("file exist.\n");
    
                FFileE = fopen (FCF, "rb");
    
                if(FFileE == NULL) {
    
                    printf("file can not open.\n");
    
                } else {
    
                    printf("password file exist.\n");
    
                    FFileF = fopen (FCG, "a+b");
    
                    if(FFileF == NULL) {
    
                        printf("file can not open.\n");
    
                    } else {
    
                        printf("output file exist.\n");
    
                        while((FID = fgetc(FFileD))!=EOF) {
    
                            for(FIG=0;FIG<=88;++FIG) {
    
                                FIE = fgetc(FFileE);
    
                                for(FII=0;FII<=10;++FII) {
    
                                    if(FIE==FCH[FII]) {
    
                                        FIH=FIH*10;
    
                                        FIH=FIH+FII;
    
                                        printf("%i",FIH);
                                        printf("\n");
    
                                    } /* if(FIE==FII) */
    
                                } /* for(FII=0;FII<10;++FII) */
    
                                if(FIE=='\n') {
    
    								FIG=99;
    
                                } /* if(FIE=='\n') */
    
                            } /* for(FIG=0;FIG<=88;++FIG) */
    
                            FID = FID - FIH;
    
                            if(FID<SHIFT) {
    
                                FID=FID + SHIFT;
    
                            } /* if(FID<SHIFT) */
    
                            fprintf(FFileF,"%c",FID);
    
                        } /* while((FID = fgetc(FFileD))!=EOF) */
    
                    } /* } else { */
    
                    fclose(FFileF);
    
                } /* } else { */
    
                fclose(FFileE);
    
            } /* } else { */
    
            fclose(FFileD);
    
        } /* for(FIF=0;FIF<=3;++FIF) */
    
    } /* void FuncEncrypt() */
    

    Danke



  • Weißt du was der Modus "a+b" bei fopen bedeutet?

    In C dürfen Variablen mit mehr als drei Zeichen bezeichnet werden.
    Nimm sprechende Variablennamen.

    Programmieren ist geht nicht nach Versuch und Irrtum. Du musst bei jeder Zeile jedem Zeichen wissen, wofür es da ist.

    In welcher Sprache ist denn das Original geschrieben?
    Hast du den Algorithmus verstanden?
    Kannst du C?
    Kannst du die Originalsprache?



  • DirkB schrieb:

    Weißt du was der Modus "a+b" bei fopen bedeutet?

    In C dürfen Variablen mit mehr als drei Zeichen bezeichnet werden.
    Nimm sprechende Variablennamen.

    Programmieren ist geht nicht nach Versuch und Irrtum. Du musst bei jeder Zeile jedem Zeichen wissen, wofür es da ist.

    In welcher Sprache ist denn das Original geschrieben?
    Hast du den Algorithmus verstanden?
    Kannst du C?
    Kannst du die Originalsprache?

    a+ -> für lesen und schreiben
    b -> Für den Binär Modus

    Das Programm ist selbst erstelt und nicht von anderen Beispielen kopiert/umgeschrieben.

    Ich denke, ich habe den Algorithmus verstanden.

    In der Programmiersprache C bin ich zwar neu, aber ich denke, es genügt für das entsprechende Programm



  • Zum Modus bei fopen
    a steht für append, anhängen. Aber das willst du gar nicht machen. Du willst schreiben und zwar von vorne.
    + lesen/schreiben ist damit aber nicht trivial. Aber warum? du willst nur schreiben.
    b ist ok

    C Neuling schrieb:

    Das Programm ist selbst erstelt und nicht von anderen Beispielen kopiert/umgeschrieben.

    Wo auch immer du das

    printf("Input\n");
        printf("%i", FIB);
        printf("\n");
    

    her hast. In C wird das in eine Zeile geschrieben.

    Warum benutz du keine Stringliterale?
    Durch die komischen Arraynamen steigt da keiner durch (du auch nicht).
    Benutze passende Funktionen fgetc kennst du. Es gibt auch fputc

    Dein Array FCH hat nur 10 Element. Du willst aber auf ein 11. zugreifen

    Um eine Schleife vorzeitig zu beenden gibt es break



  • Gibt es denn funktionierenden Quellcode in C für das One-Time-Pad Verfahren?

    Ich finde nur wie dieses Verfahren funktioniert.
    An den Quellcode wollte ich die Umsetzung lernen.

    Danke



  • Wie es aussieht, schreibst du in deine Passwortdatei mit fprintf und %i . Das gibt also für den Menschen lesbare Zahlen (Ziffernfolgen), getrennt durch "\r\n" *

    Beim Auslesen benutzt du aber fgetc . Da wird dann aber jede Ziffer einzeln gelesen. Auch wird das '\r' und das '\n' als Zeichen erkannt.

    *Ein Zeichen in deinem Text erfordert so ca 3 bis 5 Zeichen in der Passwortdatei.

    C Neuling schrieb:

    Gibt es denn funktionierenden Quellcode in C für das One-Time-Pad Verfahren?

    Die Forensuche funktioniert z.Zt. nur über "powered by Google"
    Aber da wird was gefunden.

    C Neuling schrieb:

    Ich finde nur wie dieses Verfahren funktioniert.
    An den Quellcode wollte ich die Umsetzung lernen.

    Da steht dir im Augenblick noch der Mangel an Übung mit C etwas im Weg.

    Hast du schon die Caesar-Verschlüsselung probiert?


Anmelden zum Antworten