Programm zum Verschlüsseln von Texten



  • ;fricky schrieb:

    wozu überhaupt der type cast?

    Um den ASCII-Wert (den man erhält) als ASCII-Zeichen darzustellen!?



  • Kóyaánasqatsi schrieb:

    ;fricky schrieb:

    wozu überhaupt der type cast?

    Um den ASCII-Wert (den man erhält) als ASCII-Zeichen darzustellen

    wäre unnötig, wenn du z.b. putchar oder printf ("%c", ...) genommen hättest:

    putchar ('A'+1); // B
    printf ("%c", 'A'+2); // C
    

    ^^gibt immer zeichen aus.

    _qwert: wie arbeitet denn deine verschlüsselung?
    🙂



  • ;fricky schrieb:

    ... ^^gibt immer zeichen aus.

    Du kleiner Rüpel du, habe std::cout benutzt (Typischer C++-Instinkt^^).



  • ;fricky schrieb:

    _qwert: wie arbeitet denn deine verschlüsselung?
    🙂

    Also meine Verschlüsselung sollte eigentlich jedes Zeichen der "unverslt.txt" Datei einlesen, es um 1Bit nach links verschieben, und dann in die Datei "verslt.txt" schreiben.
    (oder umgekehrt, wenn am Anfang "entschlüsseln" gewählt wurde)

    Das mit dem Verschlüsseln klappt anscheinend (in der verslt.txt steht nur schrott^^ ...nur leider immer das gleiche, egal was ich verschlüsseln lasse)
    Und beim Entschlüsseln kommt leider auch nichts Gescheites bei raus, obwohl ich jedes Zeichen wieder um einen Bit nach rechts verschiebe -.-

    Deshabl wollte ich fragen, wo denn der (wahrscheinlich semantische) Fehler liegt?
    🙂



  • _qwert schrieb:

    Also meine Verschlüsselung sollte eigentlich jedes Zeichen der "unverslt.txt" Datei einlesen, es um 1Bit nach links verschieben, und dann in die Datei "verslt.txt" schreiben.
    (oder umgekehrt, wenn am Anfang "entschlüsseln" gewählt wurde)

    Dabei gehen die MSBs verloren und lassen sich nicht wieder herstellen.
    Bsp:
    Das Byte mit dem binären Wert 10000000 soll nach deiner Methode verschlüsselt werden. ( 10000000 << 1 ) == 00000000
    Das verschlüsselte Byte ist jetzt also 00000000
    Das MSB ging flöten.

    Was du brauchst, ist eine Bitrotation.

    MFG



  • Hey ich schlage eine Permutationschiffre vor. 2 Permutationen mit unterschiedlicher Laenge sollte als sicher in diesem Rahmen angesehen werden. Sehr einfach zu implementieren. Auch bei der Benutzung von einer Permutation muss man sich schon ein wenig was einfallen lassen, um den Text zu entschluesseln.



  • mr. bingo bongo schrieb:

    _qwert schrieb:

    Also meine Verschlüsselung sollte eigentlich jedes Zeichen der "unverslt.txt" Datei einlesen, es um 1Bit nach links verschieben, und dann in die Datei "verslt.txt" schreiben.
    (oder umgekehrt, wenn am Anfang "entschlüsseln" gewählt wurde)

    Dabei gehen die MSBs verloren und lassen sich nicht wieder herstellen.
    Bsp:
    Das Byte mit dem binären Wert 10000000 soll nach deiner Methode verschlüsselt werden. ( 10000000 << 1 ) == 00000000
    Das verschlüsselte Byte ist jetzt also 00000000
    Das MSB ging flöten.

    Was du brauchst, ist eine Bitrotation.

    MFG

    Danke, genau dasselbe hab ich grad auch bei wikipedia gelesen^^
    Nur leider steht dort nicht, wie man eine bitrotation macht.
    Das muss ich doch mit einem logischen Oder machen, oder?

    kannst du vllt. ein Beispiel geben, wie ich die bits von buffer[loop] zuerst um 1Bit nach rechts, und dann beim entschlüsseln un 1Bit nach links rotieren lasse?
    (oder umgekehrt, wenn es einfacher ist)

    EDIT:
    Ich benutze zum verschlüsseln jetzt

    buffer[loop] = (buffer[loop] << 1) | (buffer[loop] >> (8 - 1) );
    

    und zum entschlüsseln

    buffer[loop] = (buffer[loop] >> 1) | (buffer[loop] << (8 - 1) );
    

    Aber obwohl ich das durchgerechnet habe, und die Buchstaben beim Entschlüsseln wieder zum Vorschein kommen sollten, tun sie das nicht. 😞



  • _qwert schrieb:

    Aber obwohl ich das durchgerechnet habe, und die Buchstaben beim Entschlüsseln wieder zum Vorschein kommen sollten, tun sie das nicht. 😞

    Das sollte eigentlich gehen, wenn du unsigned char nimmst.
    signed char zieht beim Rechtsshift einsen von links nach, das ergibt dann Schrott.



  • Big Brother schrieb:

    signed char zieht beim Rechtsshift einsen von links nach...

    Bei negativen chars.



  • ich weis nicht, es klappt einfach nicht. 😞
    Ich habs jetzt in unsigned char geändert, aber nun schreibt er nur noch 8 "Leerzeichen" in die verschlüsselte Datei. -.-

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 10
    
    FILE *in_file, *out_file, *fopen();
    
    main()
    {
          int decrypt = 0;
          unsigned char buffer[MAX] = { 0 };
          char eng[2] = { 0 };
          int valid = 0, loop = 0;
    
          while(valid == 0)
          {
           printf("Wählen Sie die Vorgehensweise:\n\t1 - Verschluesseln\n\t2 - Entschluesseln\n");
           fgets(eng, 2, stdin);
           sscanf(eng, "%i", &decrypt);
           if( (decrypt == 1) || (decrypt == 2) )
           {
              valid = 1;
           }
           else
           {
              printf("\n\nUngueltige Eingabe!\n");
              getch();
              system("cls");
              fflush(stdin);
              valid = 0;
           }
          }
    
          if(decrypt == 1)
          {
                     if( (in_file = fopen("unverslt.txt", "r")) && (out_file = fopen("verslt.txt", "w")) == NULL)
                     {
                         printf("\nFILE konnte nicht geoeffnet werden!");
                         getch();
                         exit(1);
                     }
                     for(;loop < MAX;loop++);
                               buffer[loop] = fgetc(in_file);
    
                     loop = 0;
                     for(;loop < MAX;loop++);
                               buffer[loop] = (buffer[loop] << 7) | (buffer[loop] >> (8 - 7) );
                     buffer[loop] = 0x00;
    
                     loop = 0;
                     for(;loop < MAX;loop++)
                               fprintf(out_file, "%c", buffer[loop]);
                     fclose(in_file);
                     fclose(out_file);
          }
    
          if(decrypt == 2)
          {
                     if( ((in_file = fopen("verslt.txt", "r")) == NULL) || ((out_file = fopen("unverslt.txt", "w")) == NULL) )
                     {
                         printf("\nFILE konnte nicht geoeffnet werden!");
                         getch();
                         exit(1);
                     }
    
                     loop = 0;
                     for(;loop < MAX;loop++)
                               buffer[loop] = fgetc(in_file);
    
                     loop = 0;
                     for(;loop < MAX; loop++)
                     {
                               buffer[loop] = (buffer[loop] >> 7) | (buffer[loop] << (8 - 7) );
                     }
                     buffer[loop] = 0x00;
    
                     loop = 0;
                     for(;loop < MAX; loop++)
                               fprintf(out_file, "%c", buffer[loop]);
                     fclose(in_file);
                     fclose(out_file);
          }                
    }
    

    bin etwas ratlos...:(



  • Semikolon wegmachen:

    for(;loop < MAX;loop++); // <- das letzte da
    
    for(;loop < MAX;loop++); // <- hier auch
    


  • Guckst du ratgebers Tip und guckst du meinen Tip:

    Komm mal vom Spaghetticode weg.
    Organisiere das Programm in Teilaufgaben, die du in kleinen Funktionen/Modulen erledigst.
    So steigst du dann auch selber nach einer längeren Programmierpause besser durch.
    Wenn du schon die Datei komplett im Array hast, dann übergib es doch
    an eine kleine Funktion. Das Speichern/Lesen kann wieder eine andere Funktion erledigen, usw.

    Bsp:

    void encode ( char* s )
    {
    	unsigned char* a = (unsigned char*)s;
    	while(*a)
    		*a = ( *a << 1 ) | ( *a++ >> 7 );
    }
    
    char decode ( char* s )
    {
    	unsigned char* a = (unsigned char*)s;
    	while(*a)
    		*a = ( *a >> 1 ) | ( *a++ << 7 );
    }
    

    Dazu das Testprogramm:

    int main() 
    { 
    	char def[] = "There is no other, like Big Brother!";
    	encode(def);
    	puts(def);
    	decode(def);
    	puts(def);
    	return 0;
    }
    

    Obige encode Funktion mit festem "Rotationswert" lässt sich relativ einfach
    in eine echte Rotationsfunktion erweitern:

    // Rotiere jedes Byte n Bits nach links.
    void rotl ( char* s, int n )
    {
    	unsigned char* a = (unsigned char*)s;
    	if ( 0 == (n %= CHAR_BIT) ) return;
    	while(*a) *a = ( *a << n ) | ( *a++ >> (CHAR_BIT - n) );
    }
    
    // Rotiere jedes Byte n Bits nach rechts.
    void rotr ( char* s, int n )
    {
    // ... to be written yet ...
    }
    


  • Ok, danke, jetzt klappt es..(dummer Fehler^^)

    @big brother:
    Ich habs jetzt auch noch in Unterprogramme unterteilt, aber es sollte eigentlich nur ein kleiner Teil eines großen Programmes darstellen, daher habe ich es jetzt in nur 2 große Funktionen, nähmlich "verschluesseln" und "entschluesseln" unterteilt.

    EDIT:
    Ich habe noch einen Zähler eingebaut, der zuvor die Buchstaben zählt, die in der Datei vorhanden sind, damit er nicht mehr Bits verschiebt, als es in der Datei gibt.
    Kennt jemand eine Lösung, wie ich nach dem Zählen wieder am Anfang der Datei lande? Den im Moment muss ich die Datei schließen, und wieder öffnen, damit ich die Bits am Anfang verschieben kann.

    while( getc(in_file) != EOF ) count++;
    fclose(in_file);
    in_file = fopen("unverslt.txt", "r");
    

    Es wäre nähmlich nicht mehr so unschön, wenn ich mich mit einem Befehl wieder am Anfang der Datei befinden würde.

    Aber nochmals DANKE an Alle!! 🙂



  • Du verschiebst doch die Bits jedes einzelnen Bytes separat, da interessiert doch die Anzahl der Zeichen nicht.



  • Doch, zum Beispiel beim in die Datei schreiben 😉

    Denn wenn ich mehr Zeichen schreiben will, als ich überhaupt verschoben habe, kommt Stuss raus^^



  • _qwert schrieb:

    Kennt jemand eine Lösung, wie ich nach dem Zählen wieder am Anfang der Datei lande?

    mit fseek: http://en.wikipedia.org/wiki/Fseek
    🙂



  • _qwert schrieb:

    Doch, zum Beispiel beim in die Datei schreiben 😉

    Denn wenn ich mehr Zeichen schreiben will, als ich überhaupt verschoben habe, kommt Stuss raus^^

    Brauchst die Zeichen nicht zählen, es werden auch nicht mehr reingeschrieben:

    char encode_decode ( char c, int add )
    {
    	c = (unsigned char)c += add;
    	return c;
    }
    
    // Verschlüsseln
    	while ( (c = fgetc(in)) != EOF )
    		fputc ( encode_decode ( c, 4 ), out );
    
    	// Entschlüsseln
    	while ( (c = fgetc(in)) != EOF )
    		fputc ( encode_decode ( c, -4 ), out );
    


  • Ok, jetzt mal eine andere Frage:

    Wie verschleiere ich meine Eingabe im Konsolenprogramm.
    (Will heißen z.B. die Passwort-eingabe mit Sternchen zu versehen, oder einfach gar nicht anzuzeigen)

    EDIT: Ok, ich hab jetzt einfach mal getch() genommen.


Anmelden zum Antworten