Rc4 Verschlüsselung in BlueJ

Introser

Mitglied
Hoffe mal, dass ich hier in diesem Forum auch Hilfe zu BlueJ bekomme, wäre nett.

Also zu meiner Frage:
Ich schreibe zurzeit eine Facharbeit und muss dafür 2 Verschlüsselungs Algorithmen, einmal Cäsar, einmal RC4, Cäsar kein Problem, aber bei RC4 hackt es.

Laut Internet muss ich eine S-Box erstellen, kein Problem, dann diese S-Box ins Hexadezimal System umwandeln, hier ist mein Problem...
Habe wohl den Befehl
Java:
Integer.toHexString(x);
, was zum verschlüsselb reicht, aber wie kriege ich diesen String wieder zu einem Int?
Diesen Befehl finde ich leider nicht, weiß den vllt jemand?

Eine weitere Frage, wenn ich einen String mit einen Int(oder String) Xor(^), nimmt dann Java automatisch die Binärnummer des Strings? oder müsste ich das extra schreiben :/


Vielen Dank schonmal

Grüße Introser
 
Ahh Vielen Dank, jetzt habe ich nur noch das Problem, dass ich einen String mit einem Int XORen muss, also mein zu verschlüsselnder Text(String) mit der S-Box, die als Int bespeichert ist...
Wie geht das?? Gibt es dafür auch einen Befehl?
 
Deine zweite Frage versteh ich nicht.
Du kannst in Java mit Binärenoperatoren(^ | &) nur primitive Datentypen verknüpfen, also boolean, int, double und so weiter, aber keine Objekte wie Strings. Das geht einfach nicht.

Edit: Hab mir grad die Wikipedia-Seite zum rc4 Algorithmus angeschaut. Kannst du mir mal verraten, wozu du da Strings mit Hex-zahlen brauchst? Das lässt sich doch ganz simpel mit dem Datetyp byte implementieren.
 
Zuletzt bearbeitet:
Die Erklärung bei Wiki ist so lalala...
Manche wandeln die S-box ins Hexa System um, ist aber nicht bei allen Algorithmen so, besonders bei Wiki steht da meistens mist...




Kannte Byte vorher noch nicht 😀 aber bei Byte kann ich doch keine Zeichen speichern??
Ich will z.b. den Satz "Hallo ich bin Introser" verschlüsseln, nicht nur Zahlen, das geht mit byte doch nicht, daher wollte ich mein zu verschlüsselnder Text als String speichern, den splitten und dann verschlüsseln, geht aber nicht



edit:
Am anfang bei der ERstellung der S-Box habe ich folgende Zeile:
j= (j+s+key[i %key.length]) % 256;
Mich interresiert hier nur das "key", alle typen sind hier Ints, auch key, also das passwort, aber was ist wenn ich ein wort als passwort haben will, dann kann ich ja nicht ints und Strings addieren... Wie könnte man sowas machen?
 
Zuletzt bearbeitet:
Keine mir bekannte Verschlüsselung arbeitet mit Text. Jede Verschlüsselung bassiert darauf, dass die Information in Form einer Zahlenkette vorliegen, wobei String allerdings auch nichts anderes ist als eine Zeichenfolge und ein Zeichen durch eine Zahl repräsentiert wird. Du musst also Deinen String in ein Array von Zahlen umwandeln (Mit den genannten Methoden) und dann dieses verschlüsseln und nichts anderes.
 
Keine mir bekannte Verschlüsselung arbeitet mit Text. Jede Verschlüsselung bassiert darauf, dass die Information in Form einer Zahlenkette vorliegen, wobei String allerdings auch nichts anderes ist als eine Zeichenfolge und ein Zeichen durch eine Zahl repräsentiert wird. Du musst also Deinen String in ein Array von Zahlen umwandeln (Mit den genannten Methoden) und dann dieses verschlüsseln und nichts anderes.


Ja, genau diese Methoden brauchte ich 😉 toCharArray kannte ich zwar schon, habe es auch ausprobiert hat da aber immer einen Fehler ausgespuckt beim XORen, lag aber an etwas anderes 😉 Vielen Dank!!
 
Jetzt habe ich nur noch ein Problem, wenn ich die FUnktionen toCharArray benutze, dann einen buchstaben verschlüssele kommt ja eine Zahl dabei raus, dank dem XOR.
Aber ich will aus dieser Zahl wieder einen Buchstaben kriegen :/ wie geht das??
 
wie meinst du das?? Mein Programm sieht bisher so aus:

Java:
int t=s[((s[i]+s[j])%256)];
            char chiffre=((char) (((char)klar[k]) ^ t));

ich bekomme trdm zahlen heraus, wenn ich 2 buchstaben XORe, will aber wenn ich 2 Buchstaben XORe einen anderen Buchstaben rauskriegen
 
Ich glaub du hast da ein grundsätzliches Verständnissproblem, für den Computer gibt es keinen Unterschied zwieschen einer Zahl und einem Buchstaben. Der Java-Compiler sagt blos, dass eine Zahl vom typ char als der dieser Zahl zugeordnete Buchstabe in einen String eingefügt, bzw. ausgegeben werden soll und alle anderen Typen in die Dezimaldarstellung umgewadelt werden.
Wenn du ein Array von char's hast, kannst du daraus ganz einfach einen neuen String erzeugen, einer von den unzähligen Konstruktoren von String.
 
Okay, das funktioniert jetzt, Vielen Dank!! das
Java:
String.valueOf
fehlte mir.



Mein Programm sieht jetzt so aus:
Java:
public void sBoxErstellen(String pw, String klartext){
        key = pw.toCharArray();
        klar= klartext.toCharArray();
        
        aus= new char[klar.length];
        s= new int[256];
        for (int a=0; a < 256;a++){
            s[a]= a;

        }
        j=0;
        i=0;

        for (int i=0; i< 256;i++){
            j= (j+s[i]+key[i %key.length]) % 256;
            speicher=s[i];
            s[i]=s[j];
            s[j]= speicher;
        }
        i=0;j=0;
        sb = new StringBuffer();
        for(int k=0;k<klar.length;k++){      
            i=(i+1)%256;
            j=(s[i]+j)%256;
            speicher=s[i];
            s[i]=s[j];
            s[j]= speicher;
            int t=s[((s[i]+s[j])%256)];
            aus[k]=((char) (((char)klar[k]) ^ t));
            aus2= String.valueOf(aus[k]);
          
			sb.append(aus2);
            
        }
        
    }


Bei manchen einzelnen Buchstaben kommt ein verschlüsselter Buchstabe raus, verschlüssel ich diesen noch einmal, kommt wieder der Anfangsbuchstabe raus, aber bei vielen Buchstaben kommen Zeichenketten wie "&Ö¾cÆF<ô½I°" heraus, warum das?? Sollten nicht nur "normale" buchstaben herauskommen??
 
Warum wandelst du das Zeichen erst in einen String um, wenn du den dann nur einem StringBuffer hinzufügst, du kannst das Zeichen dem StringBuffer auch dirket hinzufügen.
Das Problem mit den komischen Zeichen liegt darin begrüdet, das char 16-bit ist und somit 65.536 verschiedene Zeichen fast, der Computer aber nur einen Bruchteil davon darstellen kann. Und beim Kodieren können auch diese Zeichen entstehen, die dann entweder als zwei Zeichen dargestellt werden oder auch als Fragezeichen in einer Raute. Wenn du diesen Text kopierst und dann wieder zu entschlüsseln versuchst, kann es sein, dass das ganze nicht mehr funktioniert.
 
Den kenne ich schon 😉
aber einen String kann ich doch nicht in einen Short array umwandeln= zumindest finde ich keine Funktion die das macht...
 
Java:
import java.io.ByteArrayOutputStream;

class RC4 {

	final byte S [] = new byte[256];
	
	private RC4(final byte [] key) {
		
		for(int i=0;i < S.length; i++) {
			S[i]=(byte)(i&0xFF);
		}
		
		// key schedule
		int j=0;
		byte tmp;
		for(int i = 0; i < S.length; i++) {
			
			tmp = S[i];			
			j += tmp;
			j += key[i % key.length];
			j &= 0xFF;			
			S[i] = S[j];
			S[j] = tmp;
		}
	}
	
	public static RC4 getInstance(final byte [] key) {
		if(key.length < 5 || key.length > 255) {
			throw new IllegalArgumentException("key length must be between 5 and 255");
		}
		
		return new RC4(key);
	}
	
	public byte [] crypt(final byte [] plain) {
		int i = 0, j = 0; 
		byte tmp;		
		final ByteArrayOutputStream bos = new ByteArrayOutputStream(plain.length);
		for(final byte b : plain) {
			
			tmp = S[i];			
			i++;
			i &= 0xFF;			
			j += tmp;
			j &= 0xFF;		    
		    S[i] = S[j];
		    S[j] = tmp;
		    
		    bos.write(b ^ S[(S[i] + tmp)& 0xFF]);
		}
		
		return bos.toByteArray();
	}
	
	public static void main(String[] args) {
		final byte [] key = "geheim123!".getBytes();
		
		final byte [] plain=("Den kenne ich schon aber einen String "
				+"kann ich doch nicht in einen Short array umwandeln= "
				+"zumindest finde ich keine Funktion die das macht... ").getBytes();
		
		
		final byte cipher [] = RC4.getInstance(key).crypt(plain);
		
		final byte decrypted [] = RC4.getInstance(key).crypt(cipher);
		
		System.out.println(String.format("    plain: %1$s\n   cipher: %2$s\ndecrypted: %3$s", 
			new String(plain), 
			printBytes(cipher), 
			new String(decrypted)));
	}
	
	private static String printBytes(final byte[] bytes) {
		final StringBuilder sb = new StringBuilder();
		for(final byte b : bytes) {
			sb.append(String.format("%02X", b));
		}
		return sb.toString();
	}
}
 
Zuletzt bearbeitet:
Aha, vielen Dank, nur davon versteh ich so ziemlich kaum was, da ich erst seit nem halbem Jahr Java in der Schule habe und wir da nicht viel lernen...
 

Neue Themen


Zurück
Oben