Zum Inhalt springen

XOR Verschlüsselung / symmetrische verschlüsselung


Empfohlene Beiträge

Moin leute,

ich versuche grade den text welcher vom user eingegeben wird über xor zu verschlüsseln und wieder zu entschlüsseln mit einem vorgegebenen key.

Der text wird zwar ver und auch endschlüsseld aber standig werdn kryptische zeichen hinzugefügt auserhalb der eingabe (siehe anhang eingabe war hallohallo).

leider finde ich nicht den fehler hoffe einer von euch kann mir helfen :D.

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

int main(){
    int i = 0;
    char eingabe[99];//Text eingabe des Users 
    char key[6]="930901";//Verschlüsselungs Key
    char output[99];
    char decrypt[99];

	printf("eingabe\n");
	scanf(" %s", &eingabe);
	size_t eingabelen = strlen(eingabe);
	printf("strin=%d, von eingabelen\n",eingabelen);
	
	
    for(i = 0; i < eingabelen; i++)
    {
        output[i] = eingabe[i]^key[i]; //XOR verschlüsselung
		printf("\n%d",i);
    }
    printf("\noutput XORed: %s\n", output);
    //printf("\n");
	
	
	
    for(i = 0; i < eingabelen; i++)
    {
            decrypt[i] = output[i]^key[i]; //XOR entschlüsselung
    }
    printf("Un XORed: %s\n\n", decrypt);
    printf("\n");
    return 0;
}

Danke für euer Hilfe 🤘

Unbenannt.PNG

Link zum Beitrag
Auf anderen Seiten teilen

Wie soll auch das funktionieren, wenn dein Text länger ist als dein Key?

output[i] = eingabe[i]^key[i]; //XOR verschlüsselung

Dein Key muss zwangsläufig genauso lang sein, wie dein zu verschlüsselnder Text.

In anderen Sprachen würdest du eine "Index out of Range"-Exception bekommen. C hat aber keine Bereichsüberprüfung und er greift nun mit key[i] auf einen ungeschützten Bereich, wenn der Text länger ist, als der Schlüssel.

 

Link zum Beitrag
Auf anderen Seiten teilen

Hmm hast du da vlt nen tipp komme da auf keinen grünen zweig 

    				for(i=0;i<strlen(eingabe);)
    				{
     					for(j=0;(j<strlen(key))&&(i<strlen(eingabe));j++)
     					{
      						numkey[i]=key[j]-'a';
							i++;
     					}
       				}
    
    				for(i=0;i<strlen(eingabe);i++)
    				{
     					numcipher[i]=numstr[i]+numkey[i];
   					}
    				for(i=0;i<strlen(eingabe);i++)
    				{
     					if(numcipher[i]>25)
     					{
      						numcipher[i]=numcipher[i]-26;
     					}
    				} 

habe versucht damit den key an die eingabe anzupassen kommt aber auch nur murx raus 

Link zum Beitrag
Auf anderen Seiten teilen

ok also kann den key ja in der theorie wiefolgt ändern.

char key[99]="930901"

somit habe ich den array auf max 99 zeichen erhöht oder nicht?  Und somit kann key die eingabe welche auch max 99 zeichen hat erreichen.

jetzt ist bloß die frage inwiefern ich key der eingabe anpasse.

im endefekkt müsste ja das programm die länge von dem array der eingabe mit dem array des keys vergleichen und dementsprechnd verlängern oder nicht?

Link zum Beitrag
Auf anderen Seiten teilen
vor 1 Minute schrieb Whiz-zarD:

Und wie willst du den Key verlängern?

das ist die frage 😂

vor 4 Minuten schrieb Whiz-zarD:

Was machst du bei längeren Texten?

die Eingabe wollte ich erst mal auf 100 Zeichen beschränken .

vor 2 Minuten schrieb Whiz-zarD:

Ist es nicht Verschwendung von Speicher, wenn der Text kürzer ist?

und ja das aufjedenfall aber das speicherproblem gehe ich an wenn ich mehr in der Materie stecke 😅

Link zum Beitrag
Auf anderen Seiten teilen

Soooo ein wenig überarbeitet.

allerdings spuckt er immer noch wirres zeug aus 

 

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

int main() {
  int i = 0;
  char eingabe[99] = "This is a test string";
  char key[99] = '930901'; // Encryption key
  char output[99];
  char decrypt[99];
  size_t eingabelen = strlen(eingabe);
  size_t key_len = strlen(key);

  for (i = 0; i < eingabelen; i++) {
    output[i] = eingabe[i] ^ key[i % key_len]; // XOR verschlüsselung
  }
  printf("\noutput XORed: %s\n", output);

  for (i = 0; i < eingabelen; i++) {
    decrypt[i] = output[i] ^ key[i % key_len]; // XOR entschlüsselung
  }
  decrypt[i] = 0;  // Zero terminate
  printf("Un XORed: %s\n\n", decrypt);
  printf("\n");
  return 0;
}

 

 

Link zum Beitrag
Auf anderen Seiten teilen
vor 8 Minuten schrieb Rienne:

Liegt vielleicht daran, dass du das Array vom Key auf 99 Zeichen gesetzt hast, aber der Inhalt nur 6 Zeichen lang ist.

Würde ich auch mal vermuten. Hab mich aber schon lange nicht mehr mit C beschäftigt. Die Initialisierung ist ja vom System abhängig. Unter Linux werden Variablen mit 0 initialisiert. Unter Windows gar nicht. Da könnte durchauch Datenmüll drinnenstehen. Da sollte man immer schauen, dass man Variablen sinnvoll initialisiert.

Link zum Beitrag
Auf anderen Seiten teilen
vor 7 Minuten schrieb Pizzacorgie28:

hmm gute frage selbst wenn ich den array komplett fülle kommt da ihrgentwie murx bei raus 

Welchen Array und wie?

Wenn der Key doch sowieso fest ist, kannst du doch auch von Anfang an die Länge anpassen. Also

char key[6] = "930901"; // Encryption key
size_t key_len = 6;

 

Bearbeitet von Rienne
Link zum Beitrag
Auf anderen Seiten teilen
vor 2 Minuten schrieb KeeperOfCoffee:

Uhm ... ich mach ja sonst nichts mit C++, aber im ersten Post war Key mit Anführungszeichen, im zweiten mit einfach Anführungszeichen.

Wenn ich deinen Code auf cpp.sh teste funtkioniert er nur mit einfachen Anführungzeichen...

kannst du einmal reinschreiben was du meinst? 

" " ?

oder ' ' die gehen nämlich nicht hatte das testweise versucht ohne erfolg veregesen das wieder zu ändern vor dem einfügen.

 

Gerade eben schrieb Rienne:

Welchen Array und wie?

oh sry key meinte ich einfach den key also  930901 so heufig hintereinander geschrieben bis array voll xD

Link zum Beitrag
Auf anderen Seiten teilen
vor 3 Minuten schrieb KeeperOfCoffee:

Uhm ... ich mach ja sonst nichts mit C++, aber im ersten Post war Key mit Anführungszeichen, im zweiten mit einfach Anführungszeichen.

Stimmt. Hab es mal Online ausgeführt. Die einfachen Anführungszeichen führen bei einem Online Compiler zu einem Compilefehler. Wenn ich sie durch doppelte Anführungszeichen ändere, dann sieht es gut aus.

Link zum Beitrag
Auf anderen Seiten teilen

Das ist auch richtig. Die ersten 32 Zeichen im ASCII sind Steuerzeichen und sind nicht druckbar.

m[YJ => this

Das nächste Zeichen ist "Data Link Escape":

Zeichen     ASCII-Wert  Binär
Leerzeichen 32          0010 0000
0           48          0011 0000

  0010 0000
^ 0011 0000
-----------
  0001 0000
  

						

10000 ist in Dezimal 16 und somit das Steuerzeichen "Data Link Escape".

 

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