Zum Inhalt springen

XOR Verschlüsselung / Symmetrische Verschlüsselung in C


Empfohlene Beiträge

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
Link zum Beitrag
Auf anderen Seiten teilen
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?

 

Link zum Beitrag
Auf anderen Seiten teilen

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.

Link zum Beitrag
Auf anderen Seiten teilen

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 

Link zum Beitrag
Auf anderen Seiten teilen

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
Link zum Beitrag
Auf anderen Seiten teilen

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 🤙

 

Link zum Beitrag
Auf anderen Seiten teilen

Deine Meinung

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Benutzerkonto hast, melde Dich bitte an, um mit Deinem Konto zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2021 by SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung