
Java - Cézarova šifra - pomoc, při dešifrování program hází error
Dobrý den,
Učím se teprve chvíli javu. Chtěl jsem si skusit napsat program který bude trochu pokročileji pracovat s caesarovou šifrou,ale nedopadlo to zrovna nejlépe.
Zašifrovat se mi to daří dobře, ale rozšifrování nejde. Přitom v editoru žádné errory, ani warningy nemám :/.
package šifrovač;
import java.util.Scanner;
/**
*
* @author Slu
*/
public class Šifrovač {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Chcete šifrovat / dešifrovat? [1/2]");
if (Integer.parseInt(sc.nextLine()) == 1)
{
System.out.println("Zadejte to co chcete zašifrovat");
String sentence = sc.nextLine();
String sifra = "";
System.out.println("Zadej posun. (v číslech)");
int sifrkod = Integer.parseInt(sc.nextLine().trim());
System.out.println("zadej oddělovač znaků");
String oddel = String.valueOf(sc.nextLine());
System.out.println("zadal jsi "+sentence+". Šifruji kodem "+"X1"+sifrkod+"abc"+oddel);
for (char c: sentence.toCharArray())
{
int i = (int)c;
sifra += 26-i+97+sifrkod+oddel; //26 je pocetpismen,97 je start A v ASCII.
}
sifra = sifra.toUpperCase();
System.out.println("úspěšně zašifrováno do "+sifra);
}
else
{
System.out.println("co chcete rozšifrovat?");
String zasifrovane = sc.nextLine();
System.out.println();
System.out.println("zadej !KOMPLETNÍ! šifrovací kod");
String sifrokod = sc.nextLine();
boolean zacateksifr = sifrokod.startsWith("X1");
boolean stredsifr = sifrokod.contains("abc");
if ((zacateksifr == true) && (stredsifr == true))
{
System.out.println("zašifrovaný text je "+zasifrovane+". Dešifruji klíčem "+sifrokod);
//vyčištění a nalezení posunu a separátoru
String separator = sifrokod.substring(sifrokod.lastIndexOf("abc"));
String posun = sifrokod.replace(separator, "");
posun = posun.replace("X1", "");
separator = separator.replace("abc", "");
System.out.println(posun+" "+separator);
//vyčištěno, hurá na dešifraci.
String desifrovano = "";
String[] sifrapole = zasifrovane.split(separator);
for (String i: sifrapole) {
for (int a = 0; a < sifrapole.length; a++) {
int finalniznakcislo = 26+Integer.parseInt(sifrapole[a])-97+Integer.parseInt(posun);
char finalniznak = (char)finalniznakcislo;
desifrovano += finalniznak;
}
}
System.out.println(desifrovano);
}
else
System.out.println("Tohle NENÍ platný dešifrovací kod.");
}
}
}
Když při šifrování přičítáš, tak bys při dešifrování měl odečítat a naopak.
to dělám. problém je, že místo znaků mi tam vyběhnou takové čtverečky místo znaků. tzn. jako kdyby daný znak neexistoval.
To podle mě právě neděláš. Proto se nejspíš dostáváš do oblasti netisknutelných znaků.