Verschlüsselungsproblem



  • Mahlzeit 😉

    So nach längerer Pause meld ich mich mal wieder, hatte mich etwas von C entfernt und mich in Java/Javascript/PHP und der Datenbanksprache MYSQL versucht (zum teil vermutlich mit Erfolgt ^^)

    So, jedoch hab ich ein Problem, bzw. stehe auf dem Schlauch: Ich versuche
    eine Datei binär zu öffnen, dort jedes einzelne Byte einlesen und mit einem
    Schlüssel zu verschlüsseln. Meine erste Version hat über das Dateiende hinübergeschrieben und so ein undefiniertes Dateiende hinterlassen (so hat es jedenfalls Visual Studio bezeichnet als ich die test.c verschlüsselte und wieder entschlüsselte). Ich vermute (da ich aus wut die vorherige Version gelöscht habe) dass ich jetzt was ganz einfaches sehr falsch mache ^^ Daher wär ich froh wenn ihr mal n'blick drauf werfen könntet 😉

    void SecureVarFile(string datName) {
    
    	// einzelnes Byte einlesen, verschlüsseln, in die datei schreiben (2. Versuch)
    	char temp='1';
    	string Key;
    	int i=0, j=0; // Laufvariablen
    	FILE* dat = fopen(datName, "rb+");
    
    	GetKey(Key);
    
    	if(dat != NULL) {
    		while(_GetFileSize(datName) > i) {
    			fread(&temp, sizeof(char), 1, dat); 
    
    			if( j==strlen(Key) )
    				j=0;
    			temp+=Key[j];
    			j++;
    			i++;
    			fseek(dat, sizeof(char)*(-1), SEEK_CUR);
    			fwrite(&temp, sizeof(char), 1, dat);
    
    		}
    
    		fclose(dat);
    	}
    
    }
    
    void UnSecureVarFile(string datName) {
    
    	// einzelnes Byte einlesen, entschlüsseln, in die datei schreiben (2. Versuch)
    	char temp='1';
    	string Key;
    	int i=0, j=0; // Laufvariablen
    	FILE* dat = fopen(datName, "rb+");
    
    	GetKey(Key);
    
    	if(dat != NULL) {
    		while(_GetFileSize(datName) > i) {
    			fread(&temp, sizeof(char), 1, dat); 
    
    			if( j==strlen(Key) )
    				j=0;
    			temp-=Key[j];
    			j++;
    			i++;
    			fseek(dat, sizeof(char)*(-1), SEEK_CUR);
    			fwrite(&temp, sizeof(char), 1, dat);
    
    		}
    
    		fclose(dat);
    	}
    }
    
    int _GetFileSize(string FILENAME){
    
    	WIN32_FIND_DATA FData; 
    
    	HANDLE hSearch = FindFirstFile(FILENAME,&FData); 
    	BOOL MoreFiles; 
    	int size=0;
    
    	if (hSearch != INVALID_HANDLE_VALUE) {
    		do 
    		{ 
    				size=FData.nFileSizeLow; // size holen
    
    			MoreFiles = FindNextFile(hSearch,&FData); 
    		} while (MoreFiles); 
    
    		FindClose(hSearch); 
    	}
    	else
    		size=-1;
    
    	return size;
    }
    

    Schwer zu beschreiben, grundsetzlich: Ich weiß nicht ob es falsch Verschlüsselt oder falsch Entschlüsselt. Ev. seht ihr es 😉

    Mit freundlichen Grüßen
    ITEDVO



  • Wenn du nur ein Zeichen lesen willst dann nimm fgetc
    Wenn du nur ein Zeichen schreiben willst dann nimm fputc

    Es ist sinnvoller nur einmal die Länge der Datei zu bestimmen und nicht jedesmal.

    Ausserdem kannst du das in einem Durchgang machen:

    int temp;
    while((temp=fgetc(dat))!= EOF)
    { ...
      fseek....
      fputc(temp,dat);
    }
    

    Was ist übehaupt string bei dir?



  • Kann ja sein das ich noch nicht richtig wach bin.

    Der Quelltext lässt sich als C-Quelltext compilieren?
    Oder compilierst du den als C++ und nutzt fast nur C?



  • Ich verwende als Dateiendung *.c --> Sollte dies nicht reichen um als C zu kompilieren, dann mach ich seit bald 4 jahren was falsch ^^

    String ist so definiert:

    typedef char string[200];
    

    Nach dem "Verschlüsseln" ist der Inhalt der Datei merkwürdigerweise [/]... beim entschlüsseln dann [*] ^^ Irgendwo mach ich was bedeutend falsch ^^



  • Okay, dann ist das mit dem String klar bezüglich C oder C++.

    Bei solchen Fällen bin ich eher abgeneigt Begriffe zu nehmen, die in eng verwandten Sprachen vorkommen, wenn ich dran denke. Um eventuellen Konflikten möglichst wenig Raum zu geben.

    MfG f.-th.



  • Was steht denn in der Datei
    - vor dem verschlüsseln
    - nach dem verschlüsseln
    - nach dem entschlüsseln

    und wie heißt der key und wo kommt der her (Datei oder Usereingabe)?

    Gib doch mal den key mit printf aus (oder schau es dir im Debugger an)

    itedvo schrieb:

    [/]... beim entschlüsseln dann [*] ^^

    Ist jetzt nur / und * gemeint oder gehören die Klammern und ... ^^ dazu?



  • itedvo schrieb:

    if(dat != NULL) {
    		while(_GetFileSize(datName) > i) {
    			fread(&temp, sizeof(char), 1, dat); 
    
    			if( j==strlen(Key) )
    				j=0;
    			temp+=Key[j];
    			j++;
    			i++;
    			fseek(dat, sizeof(char)*(-1), SEEK_CUR);
    			fwrite(&temp, sizeof(char), 1, dat);
    		
    		}
    

    Das ist der Overkill. Bei jedem Zeichen-Lesen wird die hier sinnfreie Funktion _GetFileSize aufgerufen. Außerdem hast du den Anfängerfehler bei direkt aufeinanderfolgenden Lese- und Schreibaktionen einer Datei gemacht.
    Außerdem heißt es standardkonform

    fseek(dat, -1L, SEEK_CUR);
    


  • Wieso sollte _GetFileSize unnötig sein? Ich verwende gerne Funktionen von mir 😉

    Ich hab nun weiter probiert und jetzt versucht anderst zu verschlüsseln:

    void SecureVarFile(string datName) {
    
    	int size, fpposition=0;
    	int z=0;
    	char temp;
    	string key = {"1234"};
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    		size = _GetFileSize(datName);
    		fseek(dat, 0, SEEK_SET);
    		while(fpposition++ < size) {
    
    			fread(&temp, sizeof(char), 1, dat);
    			if(z == 4)
    				z=0;
    			temp=temp^key[z];
    			z++;
    			//fseek(dat, -1L, SEEK_CUR); // wenn kein fseek wird am ende der datei geschrieben, wenn fseek, dann wird bis auf erstes zeichen immer wiederholt...
    			fwrite(&temp, sizeof(char), 1, dat);			
    		}
    		fclose(dat);
    
    	}
    
    }
    

    Inhalt vor Verschlüsseln:

    void SecureVarFile(string datName) {
    
    	int size, fpposition=0;
    	int z=0;
    	char temp;
    	string key = {"1234"};
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    		size = _GetFileSize(datName);
    		fseek(dat, 0, SEEK_SET);
    		while(fpposition++ < size) {
    
    			fread(&temp, sizeof(char), 1, dat);
    			if(z == 4)
    				z=0;
    			temp=temp^key[z];
    			z++;
    			//fseek(dat, -1L, SEEK_CUR); // wenn kein fseek wird am ende der datei geschrieben, wenn fseek, dann wird bis auf erstes zeichen immer wiederholt...
    			fwrite(&temp, sizeof(char), 1, dat);			
    		}
    		fclose(dat);
    
    	}
    
    }
    

    Inhalt nach verschlüsseln:

    void SecureVarFile(string datName) {
    
    	int size, fpposition=0;
    	int z=0;
    	char temp;
    	string key = {"1234"};
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    		size = _GetFileSize(datName);
    		fseek(dat, 0, SEEK_SET);
    		while(fpposition++ < size) {
    
    			fread(&temp, sizeof(char), 1, dat);
    			if(z == 4)
    				z=0;
    			temp=temp^key[z];
    			z++;
    			//fseek(dat, -1L, SEEK_CUR); // wenn kein fseek wird am ende der datei geschrieben, wenn fseek, dann wird bis auf erstes zeichen immer wiederholt...
    			fwrite(&temp, sizeof(char), 1, dat);			
    		}
    		fclose(dat);
    
    	}
    
    }
    
    Gv[i QeDuWeRarF]l(Gt]iVgVdGtUaTe >
    =	;
    [iGtGsKz,UfDpBsFt\o	=
    ;8
    Zi@tKz0>
    =	Yh@rGtYm
    ;8
    @sFr_n Ve  "2 4L}?
    :	}ItE Ra  ]oVe(Pa|N^m,"Pb";;
    8
    Zi(Pa =zN}L)H{>
    ;
    ;	ZiQe=m_VerF]laSIz(Pa|N^m)<
    ;	UfQeZkVdGt ,aSvEk_tE)>
    =	Fw[iVeRfApAsGt[o+  ]iTe >
    9
    8	;	ArUa(Ft^m,BsHz\o(Yh@r,1 Sa)9
    8	;	UfNz= )>
    8	;	=;;
    ;	GtYm=WeCp_kHyHz;>
    8	Hz+9
    8	;	/GsTe(Ra,-~L qEzKqCaR;/ VeZnZk[i GsTe ZiPdPa ]nQeUd@rWd@tXiUg@s\hXiPb]n Te\nUfQeZk RaZnFw@r ]i Gu FrEtAsIz]iYh\nZiYmCrEwVeQeYh^l..;
    ;	UfFrEt(GtYm,AsIz[o(ZhAr, 1 Ra)8	;	9
    =	<
    ;	UfXlBs(Ra)<
    ;	9
    I};
    8
    

    Inhalt nach Entschlüsseln

    void SecureVarFile(string datName) {
    
    	int size, fpposition=0;
    	int z=0;
    	char temp;
    	string key = {"1234"};
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    		size = _GetFileSize(datName);
    		fseek(dat, 0, SEEK_SET);
    		while(fpposition++ < size) {
    
    			fread(&temp, sizeof(char), 1, dat);
    			if(z == 4)
    				z=0;
    			temp=temp^key[z];
    			z++;
    			//fseek(dat, -1L, SEEK_CUR); // wenn kein fseek wird am ende der datei geschrieben, wenn fseek, dann wird bis auf erstes zeichen immer wiederholt...
    			fwrite(&temp, sizeof(char), 1, dat);			
    		}
    		fclose(dat);
    
    	}
    
    }
    
    Gv[i QeDuWeRarF]l(Gt]iVgVdGtUaTe >
    =	;
    [iGtGsKz,UfDpBsFt\o	=
    ;8
    Zi@tKz0>
    =	Yh@rGtYm
    ;8
    @sFr_n Ve  "2 4L}?
    :	}ItE Ra  ]oVe(Pa|N^m,"Pb";;
    8
    Zi(Pa =zN}L)H{>
    ;
    ;	ZiQe=m_VerF]laSIz(Pa|N^m)<
    ;	UfQeZkVdGt ,aSvEk_tE)>
    =	Fw[iVeRfApAsGt[o+  ]iTe >
    9
    8	;	ArUa(Ft^m,BsHz\o(Yh@r,1 Sa)9
    8	;	UfNz= )>
    8	;	=;;
    ;	GtYm=WeCp_kHyHz;>
    8	Hz+9
    8	;	/GsTe(Ra,-~L qEzKqCaR;/ VeZnZk[i GsTe ZiPdPa ]nQeUd@rWd@tXiUg@s\hXiPb]n Te\nUfQeZk RaZnFw@r ]i Gu FrEtAsIz]iYh\nZiYmCrEwVeQeYh^l..;
    ;	UfFrEt(GtYm,AsIz[o(ZhAr, 1 Ra)8	;	9
    =	<
    ;	UfXlBs(Ra)<
    ;	9
    I};
    8
    Gs[j!QbDpWfR`rA]i+Gu]nVbVgGuUfT`#>=;[jGuGtK/UgDwBvFw\n	:
    >8	Zh@sK3>=Ym@qGuYj
    >8	@rFu_k#Vd'%!3 3Lx?:}Nt@#R`'%]lVd/Pd|M^l+'Pa#<;8	Zh/Pd#<zI}I*Hz>
    ;;
    ZhQb8m\VdrA]iaPI{/Pd|M^l.<;
    UgQbZnVgGu')aPvDkXt@*>=Fr[jVdRaAuApGu[h.#!]nT`#>9
    8;
    AsUf-Fw^l+BvHy\n/Ym@q-6%Sb(9
    8;
    UgN}8#(>
    8;
    <<;;
    GuYj8WfCq_lH|Hy:>
    8Hy*9
    8;
    .GtT`+R`+(~O!qBzNq@aS<*#VdZiZn[j!GtT`#ZhPcPd#]oQbUa@qWe@sXlUd@r\oXlPa]o'T`\mUgQbZn#R`ZiFr@q!]n%Gv!FuEqApI{]nYm\mZhYjCwEtVdQbYm^o/);;
    UgFuEq+GuYj)ApI{[h-ZkAs+ 4#R`.8;
    9=<;
    UgXkBv+R`.<;
    9Iz;8	>>
    Gs[j!QbDpWfR`rA]i+Gu]nVbVgGuUfT`#>=;[jGuGtK/UgDwBvFw\n	:
    >8	Zh@sK3>=Ym@qGuYj
    >8	@rFu_k#Vd'%!3 3Lx?:}Nt@#R`'%]lVd/Pd|M^l+'Pa#<;8	Zh/Pd#<zI}I*Hz>
    ;;
    ZhQb8m\VdrA]iaPI{/Pd|M^l.<;
    UgQbZnVgGu')aPvDkXt@*>=Fr[jVdRaAuApGu[h.#!]nT`#>9
    8;
    AsUf-Fw^l+BvHy\n/Ym@q-6%Sb(9
    8;
    UgN}8#(>
    8;
    <<;;
    GuYj8WfCq_lH|Hy:>
    8Hy*9
    8;
    .GtT`+R`+(~O!qBzNq@aS<*#VdZiZn[j!GtT`#ZhPcPd#]oQbUa@qWe@sXlUd@r\oXlPa]o'T`\mUgQbZn#R`ZiFr@q!]n%Gv!FuEqApI{]nYm\mZhYjCwEtVdQbYm^o/);;
    UgFuEq+GuYj)ApI{[h-ZkAs+ 4#R`.8;
    9=<;
    UgXkBv+R`.<;
    9Iz
    


  • So funktioniert es jetzt... nur verstehe ich nicht wieso ich den filepointer manuell setzen muss...

    void SecureVarFile(string datName) {
    
    	int size, fpposition=0;
    	int z=0;
    	char temp;
    	string key = {"1234"};
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    		size = _GetFileSize(datName);
    		fseek(dat, 0, SEEK_SET);
    		while(fpposition++ < size) {
    
    			fread(&temp, sizeof(char), 1, dat);
    			if(z == 4)
    				z=0;
    			temp=temp^key[z];
    			z++;
    			fseek(dat, fpposition-1, SEEK_SET); // an position setzen, an der vorher gelesen wurde
    			fwrite(&temp, sizeof(char), 1, dat); // an die position schreiben
    			fseek(dat, fpposition, SEEK_SET); // setzt position an die stelle, die eigentlich durch fwrite eingenommen hätte werden müssen...
    		}
    		fclose(dat);
    
    	}
    
    }
    

    Edit:
    Ich habe jetzt eine Datei welche 1.032 KB hat, ich lese ja jetzt eigentlich Byte für Byte, erhöhe den Zähler für die Bytes... jedoch wird nur die hälfte erreicht 516 KB... Woran liegt das? <<--- Verständnisfrage



  • void SecureVarFile(string datName) {
    
    	int c,z=0;
    	char *key = "1234";
    	FILE* dat = fopen(datName, "rb+");
    
    	if(dat != NULL) {
    
    	while( (c=fgetc(dat)!=EOF )
            {   
              fseek(dat, -1L, SEEK_SET);
              c^=key[z++%4];
              fputc(c,dat);fflush(dat);
            }
    	fclose(dat);
    
    	}
    
    }
    

    So könnte es funktionieren ohne den Großteil deines Versuches und der sinnfreien Funktion _GetFileSize.



  • So Sinnfrei ist die Funktion gar nich 😉 Wenn ich jetzt den Fortschritt in Prozent ausdrücken möchte, dann brauche ich die Dateigröße 😉 Und ob ich da
    jetzt GetFileSize(...) oder _GetFileSize(...) verwende ist nicht wirklich von belang, da die Dateigröße korrekt ist 😉

    Und da meine Version funktioniert, werde ich sie wohl noch optimieren und dabei einige, mit deiner Erlaubnis versteht sich, deiner Ansätze verwenden 😉



  • Was ich aber noch Anmerken möchte ist folgendes, Byte-weises verschlüsseln dauert, ich teste es gerade, sehr lange.... Das Verschlüsseln von 1.8 GB habe ich gestern um 15 Uhr gestartet und jetzt ist es erst bei 78,94 % angelangt. Ich vermute mal ich muss mich da mal hinter den low-lvl zugriff auf Dateien wagen 😉 Aber das hat Zeit ^^



  • Machst du gerne, immer nur stückweise deine Fragestellungen zu präzisieren.
    Für große Dateien macht es natürlich wenn Sinn, zeichenweise einzulesen. Das sollte man nach 4 Jahren Programmierung schon wissen.
    Dazu sind die schon erwähnten Blockfunktionen da.
    Außerdem reicht dann dein "int" Wertebereich u.U. nicht aus.
    Außerdem schaue dir mal SEEK_CUR statt SEEK_SET an, vielleicht fällt ja dann bei dir mal der Groschen.
    Außerdem schaue dir mal setvbuf an...
    ...
    Alles Anfängertrivialitäten, die du nach 4 Jahren Programmierung immer noch nicht drauf hast.


Anmelden zum Antworten