Verschlüsselungsproblem
-
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üsselnund 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 standardkonformfseek(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> ;; ZhQb8m\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; <<;; GuYj8WfCq_lH|Hy:> 8Hy*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> ;; ZhQb8m\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; <<;; GuYj8WfCq_lH|Hy:> 8Hy*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 istUnd 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.