# Xor-Verschlüsselung



## Wathsup (29. Mai 2009)

Moin Zusammen,

ich muss für mein Informatik Projekt ein Xor Programm schreiben und ich hab kein plan wie das geht  .  Wäre echt super wenn wer von euch mal nen ganz einfaches fertiges java Xor Programm posten würde. Also man sollte in ein Kasten nen code ein geben und der sollte dann einfach xor verschlüsselt werden mehr nicht ^^.
Sollte so einfach programmiert sein wie möglch.
wäre super wen ihr so schnell wie möglcih antwortet da ich das projkekt am 4.6.09 abgeben musss.


Mfg Wathsup


----------



## Landei (29. Mai 2009)

Google sei dein Freund! Stell dir vor, du bist nicht der erste, der sowas schreiben darf.

Aber mal ein Anfang:

```
char[] password = "Passwort".toCharArray();
char[] message = "Ich bin eine hochgeheime Botschaft!".toCharArray();
char[] encryptedMessage = new char[message.length];
for(int i = 0; i < message.length; i++) {
   encryptedMessage[i] = message[i] ^ password[i % password.length];
}
System.out.println(new String(encryptedMessage));
```
Entschlüsseln darfst du selber


----------



## Spacerat (29. Mai 2009)

Forenregeln hat gesagt.:
			
		

> Zwei Dinge gleich mal vorweg:


1. Forenregeln
2. Wir machen keine Hausaufgaben
[annotation]*Kein CrossPost, sondern standard Antwort! *[/annotation]


----------



## rafaellmerer (13. Apr 2012)

```
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.util.*; 

public class Codierung {  
  public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(System.in);
    BufferedReader input = new BufferedReader(reader);
    char ch1 = ' '; 
    char ch2 = ' '; 
    char ch3 = ' ';
    char ch4 = ' ';
    char ch5 = ' ';
    char ch6 = ' ';
    char ch7 = ' ';
    char ch8 = ' ';
    char ch9 = ' ';
    char ch10 = ' ';
    char ch11 = ' ';
    int key = 0;
    char answerges= ' ';
 
do{
    System.out.println("\nEncoder/Decoder!\n");
    System.out.println("(1) Verschluesseln");
    System.out.println("(2) Entschuesseln");

    String menu_str=input.readLine();
    int menu_int=new Integer(menu_str).intValue();
    System.out.println("");
    
    if(menu_int==1){
    System.out.println("Verschluesseln\n");
    System.out.println("Gib einen Key ein!");
    String key_str=input.readLine();
        if(key_str.length()!=0){
    key=new Integer(key_str).intValue();
    if(key<129){
    System.out.println("\nGib etwas ein!");
    String input_str=input.readLine();
    switch (input_str.length()){
    case  0: System.out.println("Die Eingabe muss mind. ein Zeichen enthalten!"); break;    
    case  1: ch1=input_str.charAt(0); break;
    case  2: ch1=input_str.charAt(0); ch2=input_str.charAt(1); break;
    case  3: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); break;
    case  4: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); break;
    case  5: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); break;
    case  6: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); break;
    case  7: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); break;
    case  8: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); break;
    case  9: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); break;
    case 10: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); ch10=input_str.charAt(9); break;
    case 11: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); ch10=input_str.charAt(9); ch11=input_str.charAt(10); break;
    
    default: System.out.println("\nDie Eingabe ist zu lang!\n");
    }
    
    System.out.println("Eingabe: " + ch1 + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ch8 + ch9 + ch10 + ch11); 
 
    switch (input_str.length()){
    case 1: ch1 = (char) (ch1 ^ key); break;
    case 2: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); break;
    case 3: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); break;
    case 4: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); break;
    case 5: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); break;
    case 6: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); break;
    case 7: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); break;
    case 8: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); break;
    case 9: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); break;
    case 10: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); ch10 = (char) (ch10 ^ key); break;
    case 11: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); ch10 = (char) (ch10 ^ key); ch11 = (char) (ch11 ^ key); break;
    }
    System.out.println("Verschluesselt mit Key " +key_str+ ": "  + ch1 + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ch8 + ch9 + ch10 + ch11);

        }
        else{
        System.out.println("Der Key muss kleiner/gleich 128 sein!");
        }
        }
        else{
        System.out.println("Der Key muss mind. eine Ziffer enthalten!");        
        }
    }
    else if(menu_int==2){
    System.out.println("Entschluesseln\n");
    System.out.println("Gib den Key ein!");
    String key_str=input.readLine();
        if(key_str.length()!=0){
    key=new Integer(key_str).intValue();
    if(key<129){
    System.out.println("\nGib etwas ein!");
    String input_str=input.readLine();
    switch (input_str.length()){
    case  0: System.out.println("Die Eingabe muss mind. ein Zeichen enthalten!"); break;
    case  1: ch1=input_str.charAt(0); break;
    case  2: ch1=input_str.charAt(0); ch2=input_str.charAt(1); break;
    case  3: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); break;
    case  4: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); break;
    case  5: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); break;
    case  6: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); break;
    case  7: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); break;
    case  8: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); break;
    case  9: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); break;
    case 10: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); ch10=input_str.charAt(9); break;
    case 11: ch1=input_str.charAt(0); ch2=input_str.charAt(1); ch3=input_str.charAt(2); ch4=input_str.charAt(3); ch5=input_str.charAt(4); ch6=input_str.charAt(5); ch7=input_str.charAt(6); ch8=input_str.charAt(7); ch9=input_str.charAt(8); ch10=input_str.charAt(9); ch11=input_str.charAt(10); break;
    
    default: System.out.println("\nDie Eingabe ist zu lang!\n");
    }
    
    System.out.println("Eingabe: " + ch1 + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ch8 + ch9 + ch10 + ch11); 
 
    switch (input_str.length()){
    case 1: ch1 = (char) (ch1 ^ key); break;
    case 2: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); break;
    case 3: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); break;
    case 4: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); break;
    case 5: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); break;
    case 6: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); break;
    case 7: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); break;
    case 8: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); break;
    case 9: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); break;
    case 10: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); ch10 = (char) (ch10 ^ key); break;
    case 11: ch1 = (char) (ch1 ^ key); ch2 = (char) (ch2 ^ key); ch3 = (char) (ch3 ^ key); ch4 = (char) (ch4 ^ key); ch5 = (char) (ch5 ^ key); ch6 = (char) (ch6 ^ key); ch7 = (char) (ch7 ^ key); ch8 = (char) (ch8 ^ key); ch9 = (char) (ch9 ^ key); ch10 = (char) (ch10 ^ key); ch11 = (char) (ch11 ^ key); break;
    }
    System.out.println("Entschluesselt mit Key " +key_str+ ": "  + ch1 + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ch8 + ch9 + ch10 + ch11);

        }
        else{
        System.out.println("Der Key muss kleiner/gleich 128 sein!");
        }
        }
        else{
        System.out.println("Der Key muss mind. eine Ziffer enthalten!"); 
        }
    }
    else{
    System.out.println("Du kannst nur zwischen (1) und (2) waehlen!");
    }
    		System.out.println("");
			System.out.println("Willst du beenden?");
			String answer_str=input.readLine();
			answerges=new Character(answer_str.charAt(0)).charValue();
}while(answerges=='n');
}
}
```


----------



## Landei (13. Apr 2012)

Was ist das für ein Horror?


----------



## JavaProfi (13. Apr 2012)

Mich mal eben dem Landei anschließe. Wat is dat denn?


----------



## Geranimo (13. Apr 2012)

ähm... wie hat der das so schnell geschrieben?


----------



## Spacerat (13. Apr 2012)

@Geranimo: [IRONIE]Bitte [IRONIE]-Tags verwenden. :lol:[/IRONIE]
@all: Nu' gehört der Thread in die Witzecke.


----------



## Marcinek (13. Apr 2012)

Er ist ein Magier :lol:

OMG das ist ja ein Uralt Thread -.-


----------



## ...ButAlive (13. Apr 2012)

[IRONIE]
Das hat sicher mit Performance zu tun. Alles in einer Methode zu schreiben, macht man, da Methodenaufrufe teuer sind. 
Das Zerlegen des Strings durch 
	
	
	
	





```
switch(length)
```
 und 
	
	
	
	





```
case 0...11: charAt(0..1)
```
 ist aus 2 Gründen performanter als 
	
	
	
	





```
.toCharArray()
```
:

1. Erzeugt 
	
	
	
	





```
.toCharArray()
```
 eine Kopie des internen Arrays, das führt zu höherem Speicherverbrauch und kostet Zeit. 
	
	
	
	





```
charAt()
```
 greift direkt auf das Array zu.

2. Wenn man kein Array hat braucht man auch keine Schleife darüber. Das ist so zu sagen ein manuelles Loop unrolling

Und mal ehrlich wer hat schon Strings die länger als 11 Zeichen sind. 

Die imports auf 
	
	
	
	





```
java.awt.*
```
 und 
	
	
	
	





```
javax.swing.*
```
, optimiert der Compiler eh weg, und wenn man will kann man auch gleich eine GUI für schreiben *ohne* später die imports mühselig hinzufügen zu müssen.

Aber einen Kritikpunkt hätte ich dann doch:


```
answerges = new Character(answer_str.charAt(0)).charValue();
```

Dabei wird ein neues Character-Objekt erzeugt. Besser ist:


```
answerges = Character.valueOf(answer_str.charAt(0)).charValue();
```

Denn die Werte zwischen 0 und 127 sind dabei gecached, dadurch verbraucht man weniger Speicher.
[/IRONIE]


----------



## rafaellmerer (14. Apr 2012)

Ich weiß das dieses Thema uralt ist... 
Und ich bin auch kein profi!!!
Deshalb verarscht mich nicht so weil ich erst seit einem halben jahr programmiere!!!


----------



## AquaBall (14. Apr 2012)

Will dich ja keiner verarschen.
Aber ist dein Posting die Lösung auf die gestellte Frage, oder ist das eher ein Diskussionsbeitrag?
Wenn ja, was willst du dann damit sagen?


----------



## ...ButAlive (14. Apr 2012)

Verarschen wollte ich dich persönlich nicht, aber was hast du dir denn erwartet? Ich mein Landei hat schon vor knapp 3 Jahren einen Code gepostet, der in 7 Zeilen funktional (fast) das selbe macht wie du in 149 Zeilen. Sollte doch klar sein, welche Lösung besser ist.

Wolltest du wissen ob deine Code gut ist? Ich glaube das hätten wir geklärt.

Einfach mal im Anfängerbereich kommentarlos eine "Musterlösung" zu posten, halte ich nicht für gut. 

Falls du es dich interessiert, was man alles besser machen könnte:

1. Alles in einer Methode schreiben ist nicht gut

2. Bei Xor-Verschlüsselung läuft die Ver- und Entschlüsselung gleich ab. Du hast 2 mal den selben Code geschrieben, so etwas lagert man normalerweise in eine Methode aus und ruft diese dann entsprechend auf.

3. Anstelle mit 11 chars zu arbeiten, sollte man mit Arrays arbeiten, dann kann man zum einem die Methode 
	
	
	
	





```
String#toCharArray()
```
 zum zerlegen in einzelne Buchstaben verwenden und muss es nicht selbst machen. Zum anderen ist man dann nicht in der Anzahl der Buchstaben beschränkt.

4.  

```
answerges = new Character(answer_str.charAt(0)).charValue();
```
kann man sich sparen. 
	
	
	
	





```
answer_str.charAt(0)
```
 liefert schon ein char zurück.

5. Dein Code hat eine zyklomatische Komplexität von 56. Das sagtm grob erklärt aus, wieviele Verzweigungen es in deiner Methode gibt. Damit diese nicht zu hoch wird, sollte man den Code auf einzelne Methoden auslagern. Der Ablauf wäre bei dir in etwa so:


```
do{
Gibt aus was gemacht werden soll

int menu = leseMenuEingabe();

if(menu == 1){
   verschluesseln();
}
else if(menu == 2){
   entschlüsseln();
}
else{
 Gib "ungültige wahl" aus.
}while(nicht weitermachen);
```

Dieser Code hätte beispielsweise eine zyklomatische Komplexität von 4. 

6. 
	
	
	
	





```
key=new Integer(key_str).intValue();
```
 ist schlechter als 
	
	
	
	





```
key = Integer.parseInt(key_str);
```

7. In Java bevorzugt man CamelCase also lieber 
	
	
	
	





```
keyStr
```
 als 
	
	
	
	





```
key_str
```


----------



## JavaRafa (14. Apr 2012)

Ja ich weiß...
Nur habe ich sollche Befehle wie CharArray noch nicht gekannt, und ich hab ein wenig ADS und war stolz auf mein erstes "komplexeres" programm, also wollte ich es der Welt zeigen... was im nachhinein doch nicht so eine kluge Idee war.
Obwohl jetzt habe ich ein Feedback von einem wohl um einiges erfahreneren Programmierers. Danke ;-)


----------



## Spacerat (14. Apr 2012)

@JavaRafa: Na denn herzlich Willkommen im Forum, viel Spass beim Programmieren (lernen) und äh... Sorry für's Lustig machen.


----------



## Kevin94 (14. Apr 2012)

Mach dir nichts draus, in einem Jahr wirst du selber genauso drüber denken. Geht zumindest mir so, wenn ich mir meine ersten Projekte nochmal anschau und dann einfach nur drüber lache wie schwer ich's mir gemacht habe und was für einfache API-Funktion es doch gegeben hätte oder was für ein grausiges Design das Projekt hatte. Also Kopf hoch und weiter progammieren.

Neben bei bemerkt, ist es immer eine schlechte Idee in zwei Jahre alten Threads zu posten, außer man hat das selbe Problem und es wurde keine Lösung gepostet, aber selbst dann kann es besser sein einen neuen Thread aufzumachen. Wenn du unserer Meinung über deinen Code hören willst ohne konkrete Frage, passt das auserdem besser zu Projekte und Codeschnippsel.


----------

