Mini-"Projekt": binW - binäre Einmalverschluesselung.



  • Hallo,

    ich bin derweilen an einem kleinen Miniprojekt dran, wenn man es denn als solches bezeichnen möchte, bei dem ich eine einfache binäre Einmalverschluesselung implementiere. Das Ganze dient der Übung und dem Spaß am Programmieren mit C und allgemein, aber dennoch möchte ich euch mein bisheriges Ergebnis nicht vorenthalten und da ich immer wieder nach dem Erlernen neuer toller Dinge weiterarbeite, freue ich mich auf eure Verbesserungsvorschläge und natürlich Meinung (ein paar Dinge sind bereits geplant, z.B. Verschlüsselungsfunktion durch Paramterangabe, Speichern der Infos in eine Datei usw.)

    Edit: noch ein kleiner Hinweis: Wie aus dem Code schon hervorgeht, kann durch den Paramter

    h

    eine Beschreibung + Hilfe angezeigt werden.

    http://pastebin.ca/2054984



  • Ich hoffe das wird jetzt nicht zu schlimm, aber wenn man das Programm hier zeigt muss man sich auf Kritik nunmal gefasst machen 😃
    (Abgesehen davon sollte der Thread ins Projekte Forum).

    1. Warum mischst du deutsch und englisch? (Siehe Zeile 27, 45, 52)
    Einfach alles in englisch zu schreiben, inklusive der Hilfetexte etc. wäre wohl am sinnvollsten.

    2. Ich finde eine Einrückung mit 4 Leerzeichen ja schon übertrieben, aber 8 😕

    3. Es mangelt nicht an Platz! Die öffnende geschweifte Klammer sollte (meiner Meinung nach) ruhig in einer eigenen Zeile stehen! Das wirkt übersichtlicher.

    4. Goto's sind zu vermdeiden (S. 77). Mach dir einfach eine Funktion, die alle Parameter bearbeitet. Zudem sind -h bzw. --help üblicher als einfach nur h.

    5. Warum muss man denn Informationen und Schlüssel IN BINÄR eingeben? Wäre es nicht sinvoller, als "Information" einfach eine Datei anzugeben und als Schlüssel dann eine Zeichenfolge?

    6. Die Zeilen 123 und 124 sind Problematisch, wenn das Programm auch mit Visual Studio übersetzt werden soll. (Das kann nämlich kein C99^^)

    7. Ich habs nur kurz überflogen, aber das ganze Programm wirkt irgendwie total unübersichtlich und kryptisch, da ist definitiv noch Verbesserungsbedarf 😃

    Als Tipp:
    - Eine Funktion "ShowHelp()" die einfach aufgerufen wird wenn man das Programm ohne Parameter startet.
    - Eine Verschlüsselungsfunktion, die 2 Puffer + die jeweilige Länge übergeben bekommt. (Und entweder einen Pointer auf Speicher auf dem Heap zurück gibt (malloc()), oder einen dritten Pointer auf den Zielpuffer übergeben bekommt)
    - Dateiname & Passwort mit fgets() einlesen, Datei einlesen, Puffer mit Passwort verschlüsseln, neuen Dateinamen einlesen (für die Ausgabe), Datei schreiben, fertig.



  • Danke für die ausführliche Kritik / Verbesserungsvorschläge, daraus kann man lernen 🙂

    Vorab: Momentan beschäftige ich mich erstmalig mit Pointern und dem Umgang mit Dateien und werde als bald ich das erlernt habe, auch im Programm versuchen umzusetzen.

    Zu den anderen Vorschlägen:
    1. Ich werde es dann in eine Sprache abändern, wobei ja alle dem Nutzer erscheinenden Texte auf Deutsch sind

    2. Die Einrückung wurde immer von meinem Editor automatisch vorgenommen, das kann ich dort sicher auf 4 Leerzeichen umstellen

    3. Ich hatte mir eigentlich angewöhnt, öffnende geschweifte Klammern immer hinter jedem jeweiligen Namen / Schlüsselwort zu setzen, dadurch erkennt m.M.n. besser, zu welchem Teil sie gehört, kann deine Variante aber auch mal anschauen 😉

    4. Die Paramterbearbeitungsfunktion ist eine gute Idee, der Paramtertest wird dann auch noch bearbeitet werden, übrigens akzeptiert er momentan alle Paramter, die mit einem h beginnen, verstehe nur nicht ganz, wieso

    5. Wir hatten das in der Schule als Übung gehabt, mein Programm ist nur eine wesentlich ausführlichere Implementierung, das Prinzip der Verschlüsselung ist so gedacht, dass man eine Binärinformation durch einen Binärschlüssel verschlüsselt, rein zu Übungszwecken. Kannst du mir deine Idee näher erläutern?

    6. Damit habe ich mich ehrlich gesagt noch nicht beschäftigt 😉 Übersetze selbst alles mit GCC, kannst du mir kurz erläutern, welche Besserung in C99 vorgenommen wurde, die das Problem verursacht?

    7. Ich werde es nochmals überarbeiten, wobei ich ja immer versuche, möglichst übersichtlichen Code zu schreiben 😃

    - Die ShowHelp()-Funktion ist eine tolle Idee, werde ich ebenfalls einbauen. Überhaupt sind Funktionen eine sinnvolle Idee, dadurch wird es sicher auch verständlicherer und übersichtlicherer Code werden.

    Die zwei letzten Tipps werde ich dann später nochmals bedenken 😉

    Vielen Dank bisher, wieder einiges gelernt 🙂

    lg



  • Die Punkte 1-3 sind Glaubensfragen. Absolut persönlicher Geschmack. Die wurden hier schon heiß diskutiert. Mach das so wie es dir gefällt.

    Sicher wäre eine Sprache schöner (durchgängiger). Nur warum sollen Texte auf Englisch sein, wenn das Programm in einem deutschen Forum veröffentlicht wird?
    Und warum soll man dann auf sinnvolle Bezeichner verzichten, nur weil sie auf deutsch sind?

    Es gibt Programmiersprachen, da müssen die öffnenden Klammern in der selben Zeile stehen wie der Befehl. Man gewöhnt sich daran.

    Und wenn er schon Platz für die Klammern hat, kann er auch einen 8-Einzug nehmen. 🙂

    Der Code war schon gut formatiert.

    Ich persönlich formatiere zwar auch so wie cooky451 es vorschlägt, das ist aber ganz persönlicher Geschmack.



  • NP1 schrieb:

    6. Damit habe ich mich ehrlich gesagt noch nicht beschäftigt 😉 Übersetze selbst alles mit GCC, kannst du mir kurz erläutern, welche Besserung in C99 vorgenommen wurde, die das Problem verursacht?

    In C89 müssen Arraygrößen zur Compilezeit fest stehen. Das ist da halt nicht der Fall.

    NP1 schrieb:

    5. Wir hatten das in der Schule als Übung gehabt, mein Programm ist nur eine wesentlich ausführlichere Implementierung, das Prinzip der Verschlüsselung ist so gedacht, dass man eine Binärinformation durch einen Binärschlüssel verschlüsselt, rein zu Übungszwecken. Kannst du mir deine Idee näher erläutern?

    int main()
    {
      char buf[0x100];
      int fileSize;
      char *fileData;
      FILE *file;
      char *outData;
    
      printf("Please enter file name: ");
      fgets(buf, sizeof(buf), stdin);
      file = fopen(buf, "r"); // Datei öffnen
      if (!file)
      {
        puts("Could not open file!");
        exit(-1);
      }
    
      fseek(file, 0, SEEK_END); // Positionszeiger der Datei ans Ende setzen
      fileSize = ftell(file); // Positions des Zeigers auslesen, also Größe der Datei in byte
      rewind(file); // Positionszeiger wieder an den Anfang setzen
    
      fileData = (char*)malloc(fileSize * sizeof(char)); // Speicher reservieren um ganze Date einzulesen
      if (!fileData)
        exit(-2);
      fread(fileData, 1, fileSize, file); // Datei einlesen
      fclose(file); // Datei schließen
      printf("Please enter key: ");
      fgets(buf, sizeof(buf), file);
    
      outData = crypt_xor(fileData, fileSize, buf, strlen(buf)); // Daten verschlüsseln, die Funktion musst du schreiben
      if (!outData)
        exit(-3);
      free(fileData); // Speicher wieder freigeben
    
      printf("Please enter new file name: ");
      fgets(buf, sizeof(buf), stdin);
      file = fopen(buf, "r"); // Output Datei öffnen
      if (!file)
      {
        puts("Could not open file!");
        exit(-1);
      }
      fwrite(outData, 1, fileSize, file); // Verschlüsselte Daten in Datei schreiben
      fclose(file); // Datei schließen
      free(outData); // Speicher freigeben (wurde in diesem Beispiel von der Funktion crypt_xor() reserviert)
    
      return 0;
    }
    

    Normalerweise macht man das alles über Startparameter, aber soll ja auch nur exemplarisch sein. Habs nicht getestet, Rechtschreibfehler seien mir also verziehen 😃


Log in to reply