Po pierwsze - szanuję za ciekawe podejście do problemu. Wszyscy to robią na wykorzystując fakt, że char można zrzutować do inta i w ten sposób uzyskać jego numer w tablicy ascii. Twoje podejście jest lepsze bo da się bardzo łatwo zmienić alfabet. Jest troszeczkę wolniejsze, bo szukanie litery w stringu jest dłuższe niż rzutowanie chara na inta. Można by to rozwiązać tworząc mape: litera : jej_numer.
Duży plus za trzymanie kodu na githubie :P
A teraz do rzeczy. Ta funkcja
getMovingDistance(int key)
implementuje operator modulo :P. Wystarczyłoby napisać
DISTANCE = KEY % 26;
i wyjdzie na to samo. Skoro piszemy uniwersalny kod to można by dodawać ALPHABET.length() zamiast 26 :P.
Prawdziwy problem jest w tym ifie:
if(newCharIndex>=alphabet.length()){
newCharIndex = alphabet.length() - alphabet.indexOf(baseChar);
}
jeśli indeks wyjdzie poza tablicę (czyli musimy zawinąć) podstawiasz dlugosc alfabetu - pozycja litery. To nie ma prawa zadziałać, bo nie wykorzystujesz w tej operacji klucza :P. Dla każdego klucza zwróci to samo. Moja propozycja to dodanie zawinięcia w postaci odjęcia dlugosci alfabetu:
if(newCharIndex>=alphabet.length()){
newCharIndex -= alphabet.length();
}