Premessa 1)
Un algoritmo di "cifratura" (tutti quelli perlomeno noti e validi) lavorano solo su byte, NON su caratteri. L'algoritmo riceve una sequenza di byte (per l'algoritmo, cosa rappresentino è indifferente) e genera un'altra sequenza di byte, quella "criptata".
Nella sequenza di byte in uscita, i byte sono "raw", crudi. Non hanno alcun (apparente) significato particolare e NON sono caratteri.

Se tu parti da una stringa Java, ovvero una sequenza di char (che è un valore 16 bit che codifica i caratteri in UTF-16), per usare un qualunque algoritmo di cifratura che sia implementato in modo sensato, dovresti convertire la stringa di char in una sequenza di byte. E questo va a coinvolgere per forza le questioni sui charset (set di caratteri).
Hai considerato questo?? Perché se non l'hai fatto, allora: o non hai implementato un vero e proprio algoritmo di cifratura o hai fatto qualcosa di abbastanza strano o inusuale.


Premessa 2)
Se il tuo algoritmo tira fuori byte, essi non hanno alcun (apparente) significato. Pertanto NON ha senso trattarli come caratteri e NON ha nemmeno senso farci logiche del tipo: 19 è un carattere di controllo e ci sommo qualcosa.
Se si vuole si può rappresentare una sequenza cruda di byte in una sequenza leggibile di caratteri usando un apposito encoding tipo Base64 o Ascii85 (o altri) che in generale sono dei binary-to-text encoding. Ma questo è un altro discorso.
Se hai solo byte e non un binary-to-text encoding, NON ha praticamente senso chiedere in input all'utente la sequenza da decodificare.
Hai considerato questo?? Perché se non l'hai fatto, idem, hai fatto qualcosa di molto strano e/o inusuale.