Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem: Dateiverschlüsselung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.06.2006, 12:48 Uhr
kruemel88



Hallo,

ich bin neu hier und hab mich mittels SuFu ein bisschen in meine Thematik eingelessen.

Ich habe folgendes Problem: Ich möchte eine *.exe Datei verschlüsseln. Rein grob hab ich mir das so vorgestellt:

1. Datei öffnen
2. Datei kopieren
3. Kopierte Datei öffnen

- Schleife Anfang -
4. Zeichen auslesen -> um z.B 3 verschieben
5. verändertes Zeichen in Datei schreiben
- Schleife Ende -

Leider tut mein Programm ned so wie es tun soll... Und ich hab keine Ahnung warum.




Mein Code:


C++:
int dateiverschluesselung(void){


    //int argc;
    //char **argv;
    char filename_q[255];
    char filename_z[255];
    int c;
    int i;
    int erg, erg2;
    int key;
    int beenden;
    int zeichen;
    int schreiben;

    



    FILE *quelldatei, *zieldatei, *stream;

    //Auf '\0' legen
    for(i=0; i<254; i++){
        filename_q[i] = '\0';
        filename_z[i] = '\0';
    }

    printf("===============================================================================\n");
    printf("=                                                                             =\n");
    printf("= HINWEIS: Es duerfen keine gleichen Dateinamen bzw. Pfade angegeben werden   =\n");
    printf("= BEDINGUNG: Dateiname Quelldatei != Dateiname Zieldatei                      =\n");
    printf("=                                                                             =\n");
    printf("===============================================================================\n\n");

    
    printf("<PFAD><NAME DER QUELLDATEI>:\t");
    scanf("%s", filename_q);
    quelldatei=fopen(filename_q, "rb");

    if(quelldatei==NULL){
        printf("Konnte Datei %s nicht finden bzw. oeffnen\n", filename_q);
        return 0;
    }
    else{
        printf("<PFAD><NAME DER ZIELDATEI>:\t");
        scanf("%s", filename_z);
        zieldatei=fopen(filename_z, "w+b");
    }
    
    if(zieldatei==NULL){
            printf("Konnte Zieldatei nicht erzeugen!\n");
            return 0;
        }
        else{
            while((c=getc(quelldatei))!= EOF){
                putc(c,zieldatei);
            }
        }
    
erg = fclose(quelldatei);
erg2= fclose(zieldatei);

stream = fopen(filename_z, "r+b");

if(stream==NULL){
    printf("Konnte die Datei %s nicht finden\n", filename_z);
    return 0;
}
printf("Key:\n");
scanf("%d", &key);
fflush(stdin);

/*
while(stream != EOF){
    temp = fgetc(stream);
    printf("%d", temp);
    //temp = temp + key;
    //temp2 = fputc(temp, stream);
}

*/

beenden=0;
do{
    zeichen = fgetc(stream);
    if(ferror(stream)){
        printf("Fehler!\n");
        beenden = 1;
    }
    if(beenden=0){
        if(zeichen==EOF){
            beenden=1;
        }
    }
    if(beenden==0){
        zeichen += key;
        schreiben = fputc(zeichen, stream);
        if(schreiben==EOF){
            printf("Fehler");
            beenden=1;
        }
    }
}
while(beenden!=1);


}




Ich hoffe ihr könnt mir helfen...

Gruß
kruemel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.06.2006, 13:35 Uhr
ao

(Operator)



Zitat von kruemel88:
Leider tut mein Programm ned so wie es tun soll

Das ist nicht sehr detailliert. Ich versuchs trotzdem mal:

Pseudocode:

Code:
while (nicht am Ende)
{
    ein Zeichen lesen; // holt das Zeichen und
                         // rückt den File-Pointer um 1 weiter!
    
    Zeichen verschlüsseln;

    ein Zeichen schreiben; // schreibt an der aktuellen File-Position,
                        // d.h. hinter dem gelesenen Zeichen!
                        // Der File-Pointer wird wieder um 1 weitergerückt,
                        // d.h. der nächste Lesezugriff geht noch ein Zeichen
                        // weiter nach rechts.
}



Besser wäre:


Code:
Ganzes File in den Speicher laden (mit fread)
Speicherbereich verschlüsseln
File schließen und wieder öffnen, oder fseek (0)
Ganzes File wegschreiben (mit fwrite)



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.06.2006, 14:21 Uhr
kruemel88



OK, soweit so gut.

Die Möglichkeit mit fread werde ich mir sofort zu gemüte führen...

ich hab jetzt folgendes:

C++:
do{
  zeichen = fgetc(stram);

  test = fseek(stream, -1, SEEK_END);
  if(test<0){
     return 0;
  }
  andern = zeichen + key;

  schreiben = fputc(aendern, stream);

  if(zeichen==EOF){
     printf("Fehler");
     beenden = 1;
  }
}
while(beenden=1);



Mein Programm macht folgendes.
1. beim öffnen von test.txt (Inhalt "abcd") keine Fehler
2. bei Verabreitung in der Schleife => Endlosschleife
3. Inhalt der Textdatei nach verschlüsselung und abbruch der endlosschleife:
abcdeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee usw.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.06.2006, 15:49 Uhr
Th



Du hattest in deiner ersten Version einen elementaren Fehler:

"if(beenden=0)" -> "if(beenden==0)"

Eigentlich sollte dein Compiler dies als Warnung ausgeben!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.06.2006, 21:06 Uhr
ao

(Operator)



Zitat von Th:
Du hattest in deiner ersten Version einen elementaren Fehler:

"if(beenden=0)" -> "if(beenden==0)"

Eigentlich sollte dein Compiler dies als Warnung ausgeben!!!


Der Fehler ist immer noch drin: while (beenden = 1);

Außerdem benutzt du seek falsch. Um ein Zeichen zurückzugehen, heißt es


C++:
seek (stream, -1, SEEK_CUR);


Aber dieses zeichenweise Rumrödeln auf Dateien ist sowieso Mist. Vergiss das und bearbeite die ganze Datei auf einmal (fread, fwrite).

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.06.2006, 22:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


fertig:

C++:
fopen(..., "r+");
fread(...)
cryptdata(...)
fseek(... 0, SEEK_SET);
fwrite(...)
fclose(...)


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: