benedict Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 Hallo zusammen! ich bin neu hier und bin ganz angentan von dem Forum. Jetzt hab ich ein Problem und zwar schreibe ich meine Facharbeit in Informatik über WLAN (WEP, WPA, WPA2). Dafür habe ich mir vorgenommen den RC4 Algorithmus in Java zu implementieren. Leider habe ich jetzt einen Laufzeitfehler (ArrayIndexOutOfBounds in Zeile 41) und ich weiß nicht wo der Fehler in der Implementierung liegt. Ich wäre euch sehr dankbar wenn ihr den Fehler findet /** * * Beschreibung * Implementierung des RC4-Algorithmus * * @version 1.0 vom 02.02.2009 * Benedict */ public class RC4 { public static byte[] RC4 (byte[] klar, byte[] key){ byte S[] = new byte[256]; byte[] temp = new byte[1]; byte[] zufallsZeichen = new byte[1]; byte[] index = new byte[1]; Integer z; Integer i = 0; int j = 0; for (i = 0; i<=255;i++){ S[i] = i.byteValue(); } for ( i = 0; i<= 255; i++){ j = ((j + S[i] + key[i%key.length])%256); temp[0] = S[i]; S[i] = S[j]; S[j] = temp[0]; } i = j = 0; for(int x = 0; x <=klar.length; x++){ i = (i + 1)%256 ; j = (S[i] + j)%256; temp[0] = S[i]; S[i] = S[j]; S[j] = temp[0]; z = ((S[i] + S[j])%256); zufallsZeichen[0]= z.byteValue(); index[0] = i.byteValue(); char k = (char)S[z]; S[x]=(byte)(k^index[0]); } return S; } public static void main(String[] args) { String code = ""; String klar = "Hallo"; String key = "Test"; byte[] klartext = new byte[256]; byte[] keytext = new byte[256]; byte[] str = new byte[256]; keytext = key.getBytes(); klartext = klar.getBytes(); str = RC4(klartext,keytext); for (int q = 0; q<str.length;q++){ int ascii = str[q]; System.out.println(ascii); char zeichen = (char)ascii; code = code + zeichen; } System.out.println(code); } } Viele Grüße und schon ein Mal Danke Benedict Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaeyu Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 char k = (char)S[z]; z ist beim zweiten Durchlauf negativ (-3), deswegen die Meldung. Das erste Element in einem Array hat ja den Index 0, hier wird aber -3 übergeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dicka Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 Kein blassen Schimmer aber dein z wird ja negativ. Und dann versuchst du auf einen negativen Index zuzugreifen mit S[z]. Mit z = Math.abs((S + S[j])%256); gibts ne Ausgabe wenn das was hilft, wahrscheinlich nicht... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
benedict Geschrieben 12. Februar 2009 Autor Teilen Geschrieben 12. Februar 2009 Danke für die schnellen Antworten. Das Problem mit dem Laufzeitfehler wäre soweit behoben. Um aus dem byte Array wieder einen Text zusammen zu setzen muss ich das ganze ja wieder als integer konvertieren und dann als char wieder ausgeben. Problem ist jetzt das es negative Zahlen gibt. Das hängt wohl mit dem Zahlenkreis zusammen. Aber wie bekomme ich jetzt den richtigen ASCII Code??? Viele Grüße Benedict Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Faustenator Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 mich hätte ja auch diese Zeile hier gestört for(int x = [B]0[/B]; x [B]<= [/B]klar.length; x++){ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
benedict Geschrieben 12. Februar 2009 Autor Teilen Geschrieben 12. Februar 2009 Warum??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 weil du bei dieser schleife wohl davon ausgehst, dass der größte Index im array den wert array.length hat. Aber da java-Arrays im Index bei 0 beginnen ist der größte index array.length-1. Die schleife müsste also eigentlich so aussehen um alle Einträge im Array durchzugehen: for(int x = 0; x < klar.length; x++){ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Faustenator Geschrieben 12. Februar 2009 Teilen Geschrieben 12. Februar 2009 hmm, da war mir wohl noch ne Formatierung verloren gegangen um meinen Hinweis zu verdeutlichen. Aber speedi hat das schon richtig erklärt. Deine ArrayIndexOutOfBounds-Exceptions hätte also theoretisch auch an dieser Stelle verursacht werden können. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
benedict Geschrieben 24. Februar 2009 Autor Teilen Geschrieben 24. Februar 2009 so hab mich noch mal dran gesetzt und bin jetzt scheinbar ein wenig weiter. Habe ein paar Dinge geändert wie man unschwer erkennen kann. leider klappt es immer noch nicht richtig. vielleicht habt ihr ja eine idee woran es liegen könnte. public class RC4 { public static StringBuffer Verschluesseln(StringBuffer klar, StringBuffer key){ short[] Sbox = new short[256]; short[] Sbox2 = new short[256]; char temp; short k, ver; int j = 0; for (short i = 0; i <= 255; i++){ Sbox[i] = i; } if (key.length() > 0){ for(int i = 0; i <= 255; i++){ if(j == key.length()){ j = 0; } Sbox2[i] = (short)key.charAt(j++); } } for (short i = 0; i <= 255; i++){ j = (j + Sbox[i] + Sbox2[i])%256; temp = (char)Sbox[i]; Sbox[i] = Sbox[j]; Sbox[j] = (short)temp; } int i,t; i = j = 0; for (short x = 0; x<=klar.length()-1;x++){ //Inkrement von i i = (i+1)%256; //Inkrement von j j = (j + Sbox[i]) % 256; temp = (char)Sbox[i]; Sbox[i] = Sbox[j] ; Sbox[j] = (short)temp; t = ( Sbox[i] + Sbox[j]) % 256 ; k = Sbox[t]; ver = (short)(Sbox[x]^k); klar.setCharAt(x, (char)(klar.charAt(x) ^ k)); } return klar; } public static void main(String[] args) { StringBuffer klarText = new StringBuffer("TEST"); StringBuffer keyText = new StringBuffer("key"); System.out.println(Verschluesseln(klarText, keyText)); StringBuffer lsg = new StringBuffer(Verschluesseln(klarText, keyText)); System.out.println(Verschluesseln(lsg,keyText)); } } Schon mal danke für eure Hilfe!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 24. Februar 2009 Teilen Geschrieben 24. Februar 2009 leider klappt es immer noch nicht richtig. vielleicht habt ihr ja eine idee woran es liegen könnte. Naja, ich weiß nicht, was nicht klappt. Vielleicht solltest Du beschreiben, was Du erwartest und was Du bekommst. Ich bekomme die Klasse kompiliert und ausgeführt und erhalte zwei Zeilen Ausgabe auf der Shell. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
benedict Geschrieben 24. Februar 2009 Autor Teilen Geschrieben 24. Februar 2009 die beiden zeilen bekomme ich auch raus. Das problem ist nur, dass das ergebnis nicht mit dem übereinstimmt mit dem was aus anderen programmen rauskommt. Da sollte so etwas ähnliches wie "_)g1" rauskommen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 25. Februar 2009 Teilen Geschrieben 25. Februar 2009 Ach so. Ich kenne den Algorithmus jetzt nicht und habe auch keine Zeit, mich einzulesen. Aber Du verwendest oft den Datentyp short. Ein beliebter Fehler ist, zu vergessen, dass short ein signed Datentyp ist (wie fast alle anderen primitiven Zahl-Datentypen in Java außer char auch). Vielleicht liegt da der Fehler Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.