Kryptographie

Gast #4363990
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.
#4364084
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
}
#4364122
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?
#4364263
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.
Gast #4365432
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
Gast #4365463
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);
    }
Gast #4365476
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.
#4365516
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?
Gast #4365521
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.
#4365597
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
#4365752
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren