Forum: PC-Programmierung Kryptographie


von Appel0 A. (Gast)


Lesenswert?

Hallo,
soll einen verschlüsselten Text mit einem Programm entschlüsseln lassen. 
Das Passwort soll: Kirschsaft! lauten. Dabei sollen nur die jeweils 4 
niederen Bits des Textes mit den niederen 4 bits des 
Schlüssels(Passwort) mit einem exklusiv oder manipuliert werden. Es 
handelt sich um Buchstaben aus dem ASCII Code. Meine Frage ist, warum 
mein Code nicht funktioniert.
Code:

#include <stdio.h>
#include <stdlib.h>
#define puffer 5000

int main()
{
    FILE *geheim;
    char array[puffer];
    char hilf, schluessel[20];
    int i=0, c=0, x=0, z=0, f=0, h4, h2, h3, loesung;
    geheim = fopen ("geheim1.txt", "r");
    if( geheim == NULL)
    {
        printf("fehler");
    }
    else
    {
        printf("erfolg!\n");

        while(feof(geheim)==0)
        {
            putchar(c++);
            c=fgetc(geheim);
            array[i] = c;
            i++;

         }

        printf("\nGeben sie das Passwort ein:\n");
        gets(schluessel);
        printf("%s", schluessel);
        printf("\nDas Passwort hat %i Zeichen\n\n", strlen(schluessel));

       for(x=0; x<=strlen(array); x++)
        {
                 if(z==strlen(schluessel))
                 {z=0;}

                 hilf = 0x0F & array[i];
                 h2 =   0x0F & schluessel[z];
                 h3 =   0xF0 & array[i];
                 h4 =   hilf ^ h2;
                 loesung = h3 | h4 ;
                 putchar(loesung);
                 i++;
                 z++;

        }

    }
}

Danke für Antworten und falls ich mich nicht deutlich genug formuliert 
habe oder ihr noch fragen habt, dann gibt bitte Bescheid.

von Kaj (Gast)


Lesenswert?

Appel0 A. schrieb:
> Meine Frage ist, warum
> mein Code nicht funktioniert.

Was funktioniert denn nicht?
Compiliert das nicht? Bekommst du nicht das ergebnis das du erwartest?
Etwas mehr Informationen bitte...

von Pandur S. (jetztnicht)


Lesenswert?

Das Ganze schon mal mit einem Singlestepper abgesteppt ?

von micha (Gast)


Lesenswert?

nachdem du die Datei gelesen hast solltest du irgendwann die Variable 
"i" wieder auf Anfang==0 setzen :-). Das array könnte man auch noch zur 
Sicherheit mit '\0' initialisieren.

von Eric B. (beric)


Lesenswert?

>             putchar(c++);

Was ist denn das fürn Schwachsinn? 'c' wird im nächsten Statement 
überschrieben, also schreib einfach 'c' statt 'c++'.

> for(x=0; x<=strlen(array); x++)

Das muss bestimmt 'x < strlen(array)' sein. Und damit diese Abfrage auch 
funktioniert soll 'array' nach dem Einlesen auch mit einem \0 
abgeschlossen werden.

Ausserdem würde ich für die ersten Gehversuchen Passwort und Text 
einfach als Konstanten im Programmtext reinschreiben anstatt direkt mit 
Dateien einlesen und Benutzerabfragen zu starten.
1
char password[] = "Hallo!";
2
char text[] = "Ultrageheime text";
3
4
int main()
5
{
6
  char *pwd_idx = 0;
7
  for(int i = 0; i < strlen(text); i++)
8
  {
9
    char t = text[i] & 0x0F;
10
    t ^= password[pwd_idx] & 0x0F;
11
    t |= text[i] & 0xF0;
12
13
    putchar(t);
14
15
    pwd_idx++;
16
    if(password[pwd_idx] = '\0') pwd_idx = 0;
17
  }
18
  printf("\n");
19
}

von B. S. (bestucki)


Lesenswert?

Eric B. schrieb:
>> for(x=0; x<=strlen(array); x++)
>
> Das muss bestimmt 'x < strlen(array)' sein. Und damit diese Abfrage auch
> funktioniert soll 'array' nach dem Einlesen auch mit einem \0
> abgeschlossen werden.

Der Aufruf von strlen ist so oder so unnötig:
1
x = 0;
2
while(array[x] != '\0'){
3
  /* ... */
4
  x++;
5
}

Appel0 A. schrieb:
> while(feof(geheim)==0)
>         {
>             putchar(c++);
>             c=fgetc(geheim);
>             array[i] = c;
>             i++;
>
>          }

Warum nicht liest du die Zeichenkete nicht einfach mit fgets ein?

Appel0 A. schrieb:
> gets(schluessel);

Bitte, bitte, bitte verwende niemals gets! Siehe hier:
Beitrag "Re: Wann Tastaturpuffer mit fflush(stdin); löschen?"

Im allgemeinen sieht das Programm eher verzettelt aus. Versuche etwas 
Struktur in das Programm zu bringen, indem du Funktionen für einzelne 
und voneinander unabhängige Tätigkeiten, z.B. für das "Verschlüsseln", 
erstellst. Dann sind auch einzelne Variablen nicht über das gesamte 
Programm verstreut. Z.B. i wird an mehreren Stellen inkrementiert, aber 
niemals zurück auf null gesetzt. Bist du sicher, dass du nirgends auf 
den Speicher hinter dem Array zugreifst?

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Ich würde die (de)codier methode so umsetzen:
1
// ungetestet
2
void encrypt( char* text, size_t text_len, char* password, size_t password_len, size_t i ){
3
  for( ; i<text_len; i++ )
4
    text[i] = text[i] ^ ( password[ i % password_len ] & 0x0F );
5
}

Cryptografisch ist das aber nicht sehr sicher, Sobald der Text 
mindestens 3-mal so lang wie das Passwort ist oder Grossbuchstaben 
enthält und sich nicht textlänge/passwortlännge mal wiederholt ist es zu 
rund 80% entschlüsselbar. Poste mal etwas Verschlüsseltes ohne das 
Passwort, und ich sage was das Passwort war.

von Appel0 A. (Gast)


Lesenswert?

O`g#Befhuao

Bg"Kbeattc!gl`wff#{qah+Hofj{fo*
O`g#tgomrao+gc`k(Btupsjekfm(qdowde'
Ilk#Bdwnhe!j|d#gmq!El`~zqff$
Oh"wb|fo&miell#gaf!Dahel"tf`/
^gf#gi#wcv{bjjwf|fo&whn)ufj{f
Ohlm#ivg&`de)nfwrwdh$Un`n#gmq!Tahxl,

Afc`kan!Tmollnmb|y

Diesen Text soll ich entschlüsseln mit Bitmanipulation

von Appel0 A. (Gast)


Lesenswert?

Habe mir eure Ratschläge mal durchgelesen und werde wsl noch ein paar 
ausprobieren. Mein Passwort ist nur 11 Zeichen lang, müsste also mit 
gets einlesbar sein. Er gibt mir je nach Passwort ca. 3 Buchstaben aus, 
diese sind für unterschiedliche PW's unterschiedlich. Außerdem 
funktioniert die Zuweisung der Variablen des Textes zu array nicht, kann 
mir jemand weiterhelfen.




#include <stdio.h>
#include <stdlib.h>
#define puffer 5000

int main()
{
    FILE *geheim;
    int array[puffer], loesung[puffer], schluessel[20];
    char hilf, h4, h2, h3;
    int i=0, c=0, j=0, n=0, h=0;
    geheim = fopen ("geheim1.txt", "r");


        while(feof(geheim)==0)
        {
            c=fgetc(geheim);
            array[h] = c;
            putchar(c);
            h++;
         } // Text wird verschlüsselt gedruckt
         printf("\n\n %s", array); // eig sollte hier der verschlüsselte 
Text nochmals zur Kontrolle, ob array die Variablen erhalten hat, 
wiedergegeben werden, er gibt allerdings nichts aus.


       printf("\nGeben sie das Passwort ein:\n");
       gets(schluessel); //Passwort: Kirschsaft!





       for(i=0; i<=599; i++) //bzw. while(loesung[i] != 0)
        {        if(n==strlen(schluessel)) // if(schluessel[n]= '\0')
        {
            n=0;
        }
        else {
                 hilf = 0x0F & array[i];
                 h2 =   0x0F & schluessel[n];
                 h3 =   0xF0 & array[i];
                 h4 =   hilf ^ h2;
                 loesung[i] = h3 | h4 ;

                 i++;
                 n++;
        }
        }
    printf("\n}n\n%s", loesung);
    }

von Jürgen D. (poster)


Lesenswert?

Daniel A. schrieb:
> Poste mal etwas Verschlüsseltes ohne das
> Passwort, und ich sage was das Passwort war.

Das ist ja einfach und auf dem ersten Blick zu sehen.

Kirschsaft!







Stand ja gleich zum Anfang da :)

von Appel0 A. (Gast)


Lesenswert?

Es werden nur wenige Buchstaben, je nach Passwort ausgegeben und diese 
stimmen nicht mit dem entschlüsselten Text überein.
verschlüsselter Text:
O`g#Befhuao

Bg"Kbeattc!gl`wff#{qah+Hofj{fo*
O`g#tgomrao+gc`k(Btupsjekfm(qdowde'
Ilk#Bdwnhe!j|d#gmq!El`~zqff$
Oh"wb|fo&miell#gaf!Dahel"tf`/
^gf#gi#wcv{bjjwf|fo&whn)ufj{f
Ohlm#ivg&`de)nfwrwdh$Un`n#gmq!Tahxl,

Afc`kan!Tmollnmb|y

entschlüsselter Text:
Die Ameisen

In Hamburg lebten zwei Ameisen,
Kal*vdleq`i/fhii+A|vqund`oo+rllvba&
Bei Altona auf der Chaussee,
Li$scwom%nafmj'fjo#Gb`fm$pgk&
\de+dh%sb}r`iie}`k'|al*vniz`
Kigd!juo%aba(eouqtlk%Sjae*enr)W`n|m'

Hd`ccbo'Pldenmnjx

zusätzlich steht in der Angabe:
Wenn der Text Steuerzeichen (also Zeichen mit einem ASCII-Wert kleiner 
dem des Leerzeichens) enthält, dann werden diese nicht verändert, das 
entsprechende Zeichen aus dem Schüssel wird dabei ungenutzt 
übersprungen.

von Eric B. (beric)


Lesenswert?

Appel0 A. schrieb:

> Diesen Text soll ich entschlüsseln mit Bitmanipulation

Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort 
entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die 
Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat.

von Klaus W. (mfgkw)


Lesenswert?

Appel0 A. schrieb:
> zusätzlich steht in der Angabe:
> Wenn der Text Steuerzeichen (also Zeichen mit einem ASCII-Wert kleiner
> dem des Leerzeichens) enthält, dann werden diese nicht verändert, das
> entsprechende Zeichen aus dem Schüssel wird dabei ungenutzt
> übersprungen.

Und was verbirgst du noch, was man braucht?
Haben hier alle zuviel Zeit, um gerne eine Hausaufgabe zu erraten?

von Appel0 A. (Gast)


Lesenswert?

Ich vermute das sich  das Problem darin befindet, dass array nicht die 
Variablen des Textes zugewiesen bekommt.

while(feof(geheim)==0)
        {
            c=fgetc(geheim);
            array[h] = c;
            putchar(c);
            h++;
         }
// Text wird verschlüsselt gedruckt
         printf("\n\n %s", array);
// eig sollte hier der verschlüsselte
Text nochmals zur Kontrolle, ob array die Variablen erhalten hat,
wiedergegeben werden, er gibt allerdings nichts aus.

von Walter S. (avatar)


Lesenswert?

Eric B. schrieb:
> Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort
> entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die
> Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat.

Profs und Lehrer sind grundsätzlich unfähig,
oder was willst du damit sagen?

von Walter S. (avatar)


Lesenswert?

Appel0 A. schrieb:
> er gibt allerdings nichts aus.

wenn du die Antworten gelesen hättest:
Strings werden in C mit 0 abegschlossen

von Daniel A. (daniel-a)


Lesenswert?

Hier ein Vollständiges Programm nach den momentan bekannten Vorgaben:
1
#include <stdio.h>
2
#include <string.h>
3
#include <stddef.h>
4
5
int main( int argc, char* argv[] ){
6
  int c;
7
  size_t i=0, n;
8
9
  if( argc != 2 ){
10
    fprintf( stderr, "Usage: %s [password] < in > out\n", argv[0] );
11
    return 1;
12
  }
13
14
  char* password = argv[1];
15
16
  n = strlen( argv[1] );
17
18
  while( ( c = getchar() ) != EOF ){
19
    if( (unsigned char)c >= ' ' ){
20
      c = c ^ ( password[i] & 0x0F );
21
      if( ++i >= n )
22
        i = 0;
23
    }
24
    if( c == '\n' )
25
      i = 0;
26
    putchar( c );
27
  }
28
29
  return 0;
30
}

Dekodierter Text:
1
Die Ameisen
2
3
In Hamburg lebten zwei Ameisen,
4
Die wollten nach Australien reisen.
5
Bei Altona auf der Chaussee,
6
Da taten ihnen die Beine weh,
7
Und da verzichteten sie weise
8
Dann auf den letzten Teil der Reise.
9
10
Joachim Ringelnatz

von Eric B. (beric)


Lesenswert?

Walter S. schrieb:
> Eric B. schrieb:
>> Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort
>> entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die
>> Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat.
>
> Profs und Lehrer sind grundsätzlich unfähig,
> oder was willst du damit sagen?

Ich wollte damit sagen, dass man den Prof um die Ohren hauen sollte 
falls er die Aufgabenbeschreibung nicht vollständig definiert hätte.

Es stellte sich aber heraus, dass es der Threadersteller war, und 
nicht der Prof, der die benötigte Infos nicht hergegeben hat.

von Walter S. (avatar)


Lesenswert?

Daniel A. schrieb:
> Hier ein Vollständiges Programm nach den momentan bekannten Vorgaben:

und deswegen kommen hierher immer Schüler/Studenten um sich die 
Hausaufgaben machen zu lassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.