Markus Pitha: (C) File kodieren?

Hallo,
in mein Programm werden Textfiles eingelesen, die Zeilen von Nullen und Buchstaben enthalten. Mein Programm (Spiel) benötigt diese Angaben, um die einzelnen Levels zusammen zu setzen. Jetzt könnte natürlich jemand ganz einfach diese Textdateien editieren, um die Schwierigkeitsstufe herab zu setzen.
Gibt es irgend eine Möglichkeit die Textdatei irgendwie zu kodieren, damit man den Inhalt nicht mehr nachvollziehen und somit nicht seine eigenen Ideen dort hinterlassen kann?
Zuerst dachte ich an etwas wie eine mit fwrite erzeugte Datei, die, so weit ich das verstanden habe, binär gespeichert wird, aber eine mit write erzeugte Datei sieht bei mir genauso aus, wie eine ganz normale Textdatei.
Was gäbe es also für einen Lösungsansatz?

Markus.

--
sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
  1. 你好 Markus,

    Gibt es irgend eine Möglichkeit die Textdatei irgendwie zu kodieren, damit
    man den Inhalt nicht mehr nachvollziehen und somit nicht seine eigenen
    Ideen dort hinterlassen kann?

    Du kannst es verschleihern, indem du die Zahlen z. B. im Binär-Format
    abspeicherst:

      
    int num = 123;  
    FILE *fd;  
      
    if((fd = fopen("file","wb")) == NULL) {  
      perror("fopen");  
      return EXIT_FAILURE;  
    }  
      
    fwrite(&num,sizeof(num),1,fd);  
    fclose(fd);  
    
    

    Zuerst dachte ich an etwas wie eine mit fwrite erzeugte Datei, die, so
    weit ich das verstanden habe, binär gespeichert wird,

    Das ist korrekt, ja, ist aber nur eine Verschleiherung. Findige Köpfe sind
    trotzdem in der Lage, herauszufinden, wie das Format aussieht.

    aber eine mit write erzeugte Datei sieht bei mir genauso aus, wie eine
    ganz normale Textdatei.

    Dann hast du einen String hineingeschrieben :)

    Was gäbe es also für einen Lösungsansatz?

    Du könntest, um Platz zu sparen und es noch schwerer zu machen,
    4-Byte-Integer benutzen und darin 32 der 0en und 1en speichern. Dafür
    braucht es ja nur ein Bit. Beispiel-Encoder-Programm:

      
    #include <stdio.h>  
    #include <stdlib.h>  
      
    int main(void) {  
      static const char *numbers = "0011010110110111000110101001010001101011011011100011010100101000110101101101110001101010010100011010110110111000110101001010001101011011011100011010100101000110101101101110001101010010100011010110110111000110101001010001101011011011100011010100101000110101101101110001101010010100011010110110111000110101001010";  
      char *ptr;  
      int num = 0,cnt;  
      
      FILE *fd;  
      
      if((fd = fopen("coded","wb")) == NULL) {  
        perror("fopen");  
        return EXIT_FAILURE;  
      }  
      
      for(cnt=0,ptr = (char *)numbers;*ptr;++ptr,++cnt) {  
        if(*ptr == '1') num |= 1;  
      
        if(num < 31) num <<= 1;  
        else {  
          fwrite(&num,sizeof(num),1,fd);  
          num = 0;  
        }  
      }  
      
      fclose(fd);  
      
      return EXIT_SUCCESS;  
    }  
    
    

    Beim einlesen musst du halt immer 4 Byte auf einmal einlesen und dann die
    Zahl bitweise durchlaufen und schauen, ob das Bit gesetzt ist. Ist es
    gesetzt, kommt an der Stelle eine 1, ansonsten eine 0.

    再见,
    克里斯蒂安

    --
    Sobald dir ein Gedanke kommt, lache über ihn.
    http://wwwtech.de/
    1. Hi,

      Du kannst es verschleihern, indem du die Zahlen z. B. im Binär-Format
      abspeicherst:

      Also die einzigen Zahlen, die vorkommen, sind die Nullen. Sonst kommen nur Buchstaben vor.

      Das ist korrekt, ja, ist aber nur eine Verschleiherung. Findige Köpfe sind
      trotzdem in der Lage, herauszufinden, wie das Format aussieht.

      Das Problem hierbei ist eigentlich, dass ich noch immer nicht sicher bin, wie das nun mit der LGPL Lizenz, unter der SDL steht, ist. Wenn ich hier den kompilierten Code alleine anbieten darf, ist alles in Ordnung, aber wenn man hier jetzt auch irgendwie den Quellcode mit anbieten muss, ist die ganze Kodierung sowieso für die Katz', da jedermann dann einfach nur in den Quellcode sehen muss, um zu wissen, was das Programm nun mit der Textdatei anstellt.

      Dann hast du einen String hineingeschrieben :)

      Jup :)

      Beispiel-Encoder-Programm:

      Das sieht schon mal sehr brauchbar aus :) Das mit den Bit muss ich allerdings noch mal irgendwo nachlesen. Bin nicht sicher, ob ich das 100%ig verstanden habe.

      Danke einstweil,

      Markus.

      --
      sh:( fo:| ch:? rl:( br:> n4:( ie:{ mo:) va:) de:] zu:) fl:( ss:| ls:] js:|
  2. Moin,

    Gibt es irgend eine Möglichkeit die Textdatei irgendwie zu kodieren, damit man den Inhalt nicht mehr nachvollziehen und somit nicht seine eigenen Ideen dort hinterlassen kann?

    Die korrekte Vorgehensweise für das was du vorhast ist asymmetrische Kryptographie: Du hast einen privaten Schlüssel und dein Programm hat den öffentlichen Schlüssel dazu. Wenn du deine Dateien dann erzeugt hast, unterschreibst du sie mit dem privaten Schlüssel und dein Programm kann dann jederzeit (zum Beispiel beim Laden) überprüfen ob du die Datei auch wirklich so und unverändert erzeugt hast, und weigert sich ggbf. mit einer veränderten Datei zu arbeiten. Der Clou: Der öffentliche Schlüssel darf wirklich öffentlich sein, und jeder (zum Beispiel jeder der den Sources deines Programmes liest) darf ihn sehen.

    --
    Henryk Plötz
    Grüße aus Berlin
    ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
    1. Gibt es irgend eine Möglichkeit die Textdatei irgendwie zu kodieren, damit man den Inhalt nicht mehr nachvollziehen und somit nicht seine eigenen Ideen dort hinterlassen kann?

      Die korrekte Vorgehensweise für das was du vorhast ist asymmetrische Kryptographie: Du hast einen privaten Schlüssel und dein Programm hat den öffentlichen Schlüssel dazu. Wenn du deine Dateien dann erzeugt hast, unterschreibst du sie mit dem privaten Schlüssel und dein Programm kann dann jederzeit (zum Beispiel beim Laden) überprüfen ob du die Datei auch wirklich so und unverändert erzeugt hast, und weigert sich ggbf. mit einer veränderten Datei zu arbeiten. Der Clou: Der öffentliche Schlüssel darf wirklich öffentlich sein, und jeder (zum Beispiel jeder der den Sources deines Programmes liest) darf ihn sehen.

      Dann tausche ich halt den öffentlichen Schlüssel im Programm aus.