public class kacrypt {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub


		String strCrypt = "Mnjw ptrry Fqjc\n" +
		"Ns jnsjw Bjqy, ns ijw rfs szw sthm qjgy,\n" +
		"ifrny rfs yfjlqnhm wtgtyjs ljmy,\n" +
		"nxy inj lwtjxxyj Fzkwjlzsl, inj jx sthm lngy,\n" +
		"ifx fqqfgjsiqnhmj Kjwsxjmgnqi. \n" +
		"Ojijw Rjsxhm qjgy bnj jns Zmwbjwp,\n" +
		"bnj jns Htruzyjw uwtlwfrrnjwy.\n" +
		"Jx lngy pjnsjs, ijw xnhm ifljljs bjmwy,\n" +
		"szw jns uffw Ozljsiqnhmj xnsi kwzxywnjwy.\n" +
		"Bjss fr Mnrrjq inj Xtssj zsyjwljmy,\n" +
		"gjlnssy küw inj Iwttlx ijw Yfl.\n" +
		"Ns pqjnsjs Gfsijs xfrrjqs xnj xnhm,\n" +
		"ljms ljrjnsxfr fzk inj Ofli.\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw xjnsj Mtwwtwxhmfz.\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw jns pqjnsjx gnxxhmjs Mtwwtwxhmfz.\n" +
		"Fzk ijr Pwjzeezl ljljs inj Twiszsl\n" +
		"zsi inj xhmjnsgfw mjnqj Bjqy\n" +
		"ejqjgwnjwjs xnj inj Ejwxytjwzsl,\n" +
		"Ljbfqy zsi Gwzyfqnyäy.\n" +
		"Jwxy bjss xnj nmwj Tukjw qjnijs xjms,\n" +
		"xuzjwjs xnj Gjkwnjinlzsl.\n" +
		"Jx lngy snhmyx rjmw, bfx xnj ojyey fzkmfjqy\n" +
		"ns nmwjw lsfijsqtxjs Bzy.\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw xjnsj Mtwwtwxhmfz.\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw jns pqjnsjx gnxxhmjs Mtwwtwxhmfz.\n" +
		"Ebfsenl ljljs jnsjs\n" +
		"gnx ifx Gqzy ezr Atwxhmjns ptrry.\n" +
		"Tg rny Xytjhpjs tijw Xyjnsjs,\n" +
		"nwljsibfss uqfyey ojijw Ptuk.\n" +
		"Ifx sfjhmxyj Tukjw nxy xhmts iwfs,\n" +
		"bjss nmw ijs qnjgjs Ltyy sthm kwfly:\n" +
		"Bfwzr mfxy Iz snhmyx ljyfs,\n" +
		"snhmyx ljyfs?\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw xjnsj Mtwwtwxhmfz.\n" +
		"Mjd, mnjw ptrry Fqjc!\n" +
		"Atwmfsl fzk - küw jns pqjnsjx gnxxhmjs Mtwwtwxhmfz.";

		String strReCrypt = "Noch nichts\n"; // gecrackter String
		int iOffset=0;


		// Aufruf der Crack-Funktion
		iOffset = crack(strCrypt);

		// Entschlüsselung
		strReCrypt = crypt(strCrypt, -iOffset);

		// Ausgabe
		System.out.printf("\n==============================================\n%s", strCrypt  );
		System.out.printf("\n==============================================\n%s", strReCrypt);


	}



	private static int crack(String strEingabe) {
		// TODO Auto-generated method stub
		int [] iZ = new int[26];
		int iIndex=0;
		int iMaxZ =0, iHaeuf=0;

		// Umwandlung des Strings in Großbuchstaben 
		strEingabe = strEingabe.toUpperCase();

		// Initialisierung des Arrays zur Speicherung der Häufigkeit mit Nullen







		// Schleife durch den String von Anfang bis Ende zur Berechnung der 
		// Häufigkeiten der Buchstaben, in iZ[0] wird die Häufigkeit des As 
		// gespeichert, in iZ[25] die Häufigkeit des Zs, das alles nur, falls 
		// es ein Buchstabe ist, alle anderen werden ignoriert.














		// Maximale Häufigkeit berechnen und das entsprechende Zeichen merken 












		// Ergebnisausgabe zu Debugzwecken
		System.out.printf("Das häufigste Zeichen %c kam %d mal vor.", iMaxZ+'A', iHaeuf);
		System.out.printf("Der Offset beträgt also %d", iMaxZ - 'E'+'A');


		// Offset zurückgeben
		return (iMaxZ-'E'+'A');
	}




	private static String crypt(String strEingabe, int iOffset) {
		// TODO Auto-generated method stub
		String strGeheim = "";
		int iTyp = 0;
		int iWert=0;
		int iMod=0;
		boolean bZeichen=true;
		for (int i=0; i<strEingabe.length(); i++)
		{
			bZeichen = true; // zu verschlüsseln oder nicht
			iWert = strEingabe.charAt(i);
			//Kleinbuchstabe
			if ((iWert >= 'a')&&(iWert <= 'z'))
			{
				iTyp='a';
				iMod = 26;
			} else

				// Großbuchstabe
				if ((iWert >= 'A')&&(iWert <= 'Z'))
				{
					iTyp='A';
					iMod = 26;
				} else

					// Ziffer
					if ((iWert >= '0')&&(iWert <= '9'))
					{
						iTyp='0';
						iMod = 10;
					} else
					{
						strGeheim += (char) iWert;
						bZeichen = false;
					}


			if (iOffset >0) // positiver oder negativer Offset
				iWert=iWert+iOffset-iTyp;
			else 
				iWert=iWert+iOffset+iMod-iTyp;

			if (bZeichen == true)
			{
				System.out.printf("/");
				iWert=iWert % iMod;    
				iWert = iWert + iTyp;
				strGeheim = strGeheim + (char)iWert; 
			}
		}


		return strGeheim;
	}

}

