Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Moin Leute,

ich versuche grade XOR Verschlüsselung / Symmetrische Verschlüsselung in C zu verwirklichen allerdings bis jetzt ohne viel Erfolg.

Ich möchte das der User einen Text eingeben kann.

Danach soll der User einen, 6 stelligen nummern, Key zum verschlüsseln angeben z.b. 930910.

Daraufhin soll dann der Text mit dem Key zusammen durch XOR, verschlüsselt werden.

Leider scheint was in der" char * xorencrypt(char * text, int * key) "etwas falsch zu laufen, da das Programm einfach beendet wird mit dem Error:

Received signal :'Invalid Instruction'. Abort.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * xorencrypt(char * text, int * key) 
{
    size_t textlen = strlen(text);
    size_t keylen = strlen(key);

    char * encrypted = malloc(textlen+1);

    int i;
    for(i = 0; i < textlen; i++) 
	{
        encrypted[i] = text[i] ^ key[i % keylen];
    }
	
    encrypted[textlen] = '\0';

    return encrypted;
}

int main(void) 
{
    char *text[99];
    int *key=0;
	printf("Bitte Text eingeben:\n");
	scanf("%99s",&text);
	printf("text=%s\n",text);
	printf("Bitte Key eingeben:\n");
	scanf(" %d",&key);
	printf("key=%d\n",key);

    char * encrypted = xorencrypt(text, key);
    printf("%s\n", encrypted);
    //free(encrypted);
    return 0;
}

hoffe ihr könnt mir ein wenig weiter helfen sitze schon den ganzen tag dran und finde den Fehler einfach nicht. 🤯

 

Bearbeitet von Pizzacorgie28

vor 27 Minuten schrieb Pizzacorgie28:

brauch ich die nicht? 

Weißt du überhaupt, was ein Zeiger ist?

 

vor 27 Minuten schrieb Pizzacorgie28:

und der key soll jajedem buchstaben zugeordnet werden.

z.b. h^913112=-80

Verstehst du, was du da geschrieben hast? Weißt du, was die eckigen Klammern bedeuten?

 

  • Autor

Nur um klar zu stellen bin ziemlicher Noob und habe bereits den ganzen tag damit verbracht die kacke da zu schreiben nur damit es nicht funktioniert  😅.

Deswegen bin ich grade ein wenig am ende xD.

Habe um ehrlich zu sein auch deine frage hier nicht ganz verstanden

vor 55 Minuten schrieb Whiz-zarD:

Wieso ist in xorencrypt() key ein Zeiger auf ein Integer?

und was ich mir hierbei gedacht habe weiß ich auch grade nicht mehr wirklich  key[i % keylen]. 

bin grade einfach komplett im  Tunnel und frustriert.

  • Autor

sooooooooooooooo ich habe den code noch mal neu verfasst und diesesmal es etwas knapper gehalten. allerdings auch nicht ganz fehlerfrei.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    int i = 0;
    char eingabe[99];
    char key[6]="930913";
    char output[13];
    char decrypt[13];

	printf("eingabe\n");
	scanf(" %s", &eingabe);
	
	
	
	
    for(i = 0; i < 13; i++)
    {
            output[i] = eingabe[i]^key[i];
    }
    printf("output XORed: %s\n\n", output);
    printf("\n");
    for(i = 0; i < 13; i++)
    {
            decrypt[i] = output[i]^key[i];
    }
    printf("Un XORed: %s\n\n", decrypt);
    printf("\n");
    return 0;
}

ich kann zwar verschlüsseln und endschlüsseln bloß ist er momentan in der ascii Tabelle unterwegs und nicht binär wie ich es gerne hätte jetzt komm ich bloß nicht darauf wie ich ihn auf binär beschränken kann 

Ein Zeiger ist eine Variable, die statt den konkreten Wert die Speicheradresse zu diesem Wert besitzt. Eine Speicheradresse kann man sich vorstellen, wie eine Hausnummer, nur dass anstatt wir hier häuser Bytes haben. Die Adresse 0x1 (Hexadezimalschreibweise) ist das erste Byte im Speicher.

int i1 = 3; // i1 hat den Wert 3
int* i2 = &i; // i2 hat als Wert die Speicheradresse von i1

Das &-Zeichen ist der sog. Adressoperator. Mit dem können wir die Adresse einer Variable abrufen. Darum geben wir bei scanf() die Adresse an, wohin der Wert geschrieben werden soll.

Ich persönlich finde die Schreibweise von Zeigern, die man häufig in C-Beispielen findet, nicht so schöb, weil der Stern etwas tückisch ist. Der wird nämlich für zweierlei Dinge verwendet. Einmal für die Kennzeichnung eines Zeigers und einmal den konkreten Wert eines Zeigers zu ermitteln. Daher schreibe ich eher

int* i2 = &i1; 

anstatt

int *i2 = &i1;

So wird es für mich deutlicher, dass es sich um einen Int-Zeiger handelt und der Stern nicht zum Variablennamen dazugehört.

int main()
{
  int i1 = 3; // i1 hat den Wert 3
  int* i2 = &i1; // i2 hat als Wert die Speicheradresse von i1

  printf("Wert i1: %d\n", i1);
  printf("Adresse i1: %p\n", &i1);
  printf("Wert i2: %p\n", i2);
  printf("Adresse i2: %p\n", &i2);
  printf("Inhalt i2: %d\n", *i2);
  
  return 0;
}

Da kommt jetzt z.B. sowas raus:

Wert i1: 3
Adresse i1: 0x7ffd27627e44
Wert i2: 0x7ffd27627e44
Adresse i2: 0x7ffd27627e48
Inhalt i2: 3

i2 hat jetzt nun als Wert die Speicheradresse von i1. Liegt aber in einem anderen Speicherbereich und der konkrete Inhalt ist die Zahl 3.

Ein String wird in C als Array von Characters dargestellt. Ein Array ist wiederum eine Sonderform eines Zeigers. Die Variable zeigt auf das erste Element des Arrays.

int main() {
  char text[] = "Hallo Welt";
  printf("Inhalt text: %c\n", *text);
  printf("Wert text: %p\n", text);
  
  return 0;
}

Da kommt z.B. das dabei raus.

Inhalt text: H
Wert text: 0x7fff5582eead

Der Inhalt ist einfach 'H' und als Wert die Adresse.

Die Eckigen Klammern, z.B. bei text[2] ist ein indexierter Zugriff. Wir haben es dann hier mit einer Zeiger-Aritmethik zu tun und zwar wird der Zeiger um zwei Stellen verschoben. Da er weiß, dass es sich hier um ein Char-Array handelt und ein Char ein Byte groß ist, weg er nun von der Speicheradresse zwei Bytes weiter. In unserem Beispiel wäre dies das Zeichen 'l'.

Bearbeitet von Whiz-zarD

  • Autor

Danke nochmal für deine Erklärung bin ich nicht weiter drauf eingegangen sry also was ein zeiger ist ist mir zumindest schon klar :D.

Allerdings ist das mit dem * echt bescheiden und finde ich persönlich auch mega hässlich finde das in C#bzw. c++ besser gelöst aber was will man machen :D .

Aber das mit den [ ] habe ich bis jetzt tatsächlich noch nie verstanden dank dir 🤙

 

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.