# ROT13-Algorithmus



## Thisor (15. Dez 2015)

Hallo,
Beim ROT13-Algorithmus wird jeder Buchstabe um 13 Stellen im Alphabet nach vorn oder hinten geschoben. In Java bedeuted dies, man muss zu einen char 13 addieren oder subtrahieren. Sonderzeichen lasse ich unverändert.
Beispiele:
rot13("Hallo") -> "Unyyb" 
rot13("Unyyb") -> "Hallo"

Mein Code lautet bisher :

```
char [] neu = new char[100];
       

        for (int i = 0; i < text.length; i++) {
            char c = (char)text[i];

            if (c >= 'a' && c <= 'm')
                c += 13;
            else if (c >= 'A' && c <= 'M')
                c += +13;
            else if (c >= 'n' && c <= 'z')
                c -= 13;
            else if (c >= 'N' && c <= 'Z')
                c -= 13;
            
            neu = c;
        }
        return neu;

    }
}
```

ich kann c aber nicht zu neu zuweißen, da "cannot convert from c to [] c


----------



## Daimond (15. Dez 2015)

Du willst in der Vorletzten zeile deinem Array einen wert zuweisten von einer nicht Array Variable. Du musst beim Array ein Index angeben.(neu[i] = c)


----------



## Daimond (15. Dez 2015)

Aus irgendein Grund hat das forum ein Teil meiner Antwort nicht genommen und ich kanns auch nicht bearbeiten. Es sollte (neu[i] = c) heißen.

Edit: Klappt auch im neuen Post nicht
neu "eckeigeklammerauf" i "eckeigeklammerzu" = c


----------



## InfectedBytes (15. Dez 2015)

Der grund ist, dass [i] in kursivschrift umgewandelt wird.
Entweder code tags benutzen oder plain tags
[code]...[/code]


----------



## Joose (15. Dez 2015)

@Daimond warum das mit dem [i] nicht klappt hat dir @InfectedBytes schon gesagt. Habe es in deinen Post mal richtig reineditiert.


----------



## Daimond (15. Dez 2015)

@Joose Ok danke dir.
Edit: @Thisor ist dir jetzt klar wo dein Fehler liegt?


----------



## Thisor (15. Dez 2015)

@Daimond
Ich denke schon, allerdings komme ich nicht zurecht wo ich das einfügen soll.
Es muss noch in die For-Schleife kommen aber wohl doch nicht nach jeder if-anweißung, oder?
Ich meine es vorhin dennoch ausprobiert zu haben aber die JUnit Test´s waren dann nicht richtig.

Mal was anderes:
Kann ich das Array noch anders belegen als :
char [] neu = new char[100]; ?

Edit:
Ich hab jetzt nochmal in jedem if-statement 
neu_ = c; eingefügt. Wenn ich es durchlaufen lasse kommen wie erwähnt die Fehler. Doch wenn man sich das mal anschaut kommt:

org.junit.ComparisonFailure: expected:<Unyyb[]> but was:<Unyyb[

also fehlt mir die zweite eckige klammer..? 

lg_


----------



## JStein52 (15. Dez 2015)

Ja, dein Array solltest du mit:


```
char [] neu = new char[text.length];
```

anlegen. Und du musstest doch nur aus 

```
neu = c;
```
ein

```
neu[i] = c;
```
machen.


----------



## Thisor (15. Dez 2015)

JStein52 hat gesagt.:


> Ja, dein Array solltest du mit:
> 
> 
> ```
> ...



jap, allerdings hab ich  :


```
public static char[] rot13(char[] text) {

        char[] neu = text;
        // neu = ;
        for (int i = 0; i < text.length; i++) {

            char c = text[i];

            if (c >= 'a' && c <= 'm') {
                c += 13;
                neu[i] = c;

            } else if (c >= 'A' && c <= 'M') {
                c += +13;
                neu[i] = c;

            } else if (c >= 'n' && c <= 'z') {
                c -= 13;
                neu[i] = c;

            } else if (c >= 'N' && c <= 'Z')
                c -= 13;
            neu[i] = c;
        }

        return neu;

    }
}
```

so funktioniert das auch 
wieso würde

```
char [] neu = new char[text.length];
```
funktionieren? text.length ist ja ein int wert, caste ich das in der Zeile?


----------



## JStein52 (15. Dez 2015)

Ja so funktioniert das auch. Aber damit zeigt neu auf text, d.h. du legst kein neues array an ! Ist in dem Fall vermutlich nicht schlimm weil du den Originaltext nicht mehr brauchst.
Und wieso denkst du dass du in besagter Zeile irgendwas castest ? Wie du doch selber sagst: text.length ist int-Wert und als Länge des Arrays brauchst du doch einen int-Wert. Du hattest doch vorher auch 100 dort stehen !! 100 ist auch int


----------



## Thisor (15. Dez 2015)

Oh, ja stimmt..ich weiß nicht was mir durch den Kopf ging 
Mit [100] belegte ich ja 100 Speicher und mit text.length eben exakt die Anzahl der Elemente die vorkommen. Dass beides int-Werte sind, ist mir klar, allerdings dachte ich, dass die länge eines arrays nicht dasselbe ist wie wenn ich nur zb 100 schreibe. Dabei ist es dasselbe


----------



## JStein52 (15. Dez 2015)

Genau.


----------



## tommysenf (16. Dez 2015)

Anbei wollte ich dir noch den Hinweis geben, dass du den Algorithmus nicht für sicherheitskritische Sachen anwenden solltest.
ROT13 gilt seit geraumer Zeit als unsicher und überholt. Hier solltest du lieber den ROT26 Algorithmus verwenden, welcher bedingt durch die doppelte Verschiebelänge logischerweise auch doppelt so viel Sicherheit bietet.

SCNR


----------



## JStein52 (16. Dez 2015)

@tommysenf : ist das so ? Wieso bietet der ROT26 doppelt soviel Sicherheit ? Das leuchtet mir noch nicht ein. Ob ich um 13 oder 26 verschiebe ist doch ziemlich egal ??  Oder nicht ?


----------



## InfectedBytes (16. Dez 2015)

ich nehme mal an er hatte es als scherz gemeint. 
wenn man das Alphabet (26 Buchstaben) um 26 Stellen verschiebt, erhält man logischerweise wieder den ursprünglichen Text => keinerlei verschlüsselung


----------



## JStein52 (16. Dez 2015)

Ja eben. So weit hatte ich auch schon gedacht. Aber er verschiebt ja in der ASCII-Tabelle da ist das ja nicht so. 'a' + 26 = ???  (jedenfalls nicht 'a')    also doch dopplet so sicher


----------



## tommysenf (16. Dez 2015)

Als Beleg noch mal ein paar seriöse Quellen:

https://www2.informatik.uni-hamburg.de/fachschaft/wiki/index.php/ROT26

http://rot26.org


----------



## JStein52 (16. Dez 2015)

ok. Danke.  Wobei aber ROT26 nicht einfach eine Verschiebung um 26 ist sondern ein doppelter ROT13 !!  Das ist ein kleiner Unterschied und erklärt die Aussage doppelt so sicher ! Wobei das mit dem sicher ja wohl eher relativ ist. Es ist halt so sicher dass ein normaler Mensch 5 Minuten braucht um drauf zu kommen statt 1 Minute.


----------

