class SimpleAffine { private static int[] aValues = {1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25}; // Werte von a private static int[] aInvValues = {1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25}; // Inverse Werte von a // Gebe einen Zahlenwert zurück, der dem Zeichen aus dem String str an der Position pos entspricht // Dabei entspricht A der 0, B der 1,... private static int val(String str, int pos) { return str.charAt(pos) - 'A'; // Ziehe vom Zeichen den Wert des A ab } // Umkehrfunktion zu val(), gibt ein Zeichen zurück, das dem gegebenen Wert entspricht private static char chr(int val) { return (char)(val + 'A'); // Addiere den Wert des A und wandle den Zahlenwert in ein Zeichen um } // Funktion, die einen String mithilfe der affinen Chiffre und Schlüssel a und b entschlüsselt public static String decrypt(String cipher, int a, int b) { int aInv = 0; // Inverse von a int c; // Wert des entschlüsselten Zeichens String str = ""; // Rückgabestring // Berechne die Inverse von a for(int i = 0; i < aValues.length; i++) { // Gehe alle Werte von aValues durch um die passende Inverse zu finden if(aValues[i] == a) { // Falls der Wert gefunden wurde, Inverse setzen aInv = aInvValues[i]; } } // Gehe den gesamten String durch und wandle jedes Zeichen in Klartext um for(int i = 0; i < cipher.length(); i++) { c = (aInv * (val(cipher, i) - b)) % 26; // Wende die invertierte Funktion des affinen Chiffre an if(c < 0) c += 26; // Falls w negativ, addiere 26 str += chr(c); // Hänge das entschlüsselte Zeichen an str } return str; } // Funktion, die den String mit allen möglichen Schlüsseln entschlüsselt und ausgibt public static void bruteforce(String cipher) { String d; // Der Entschlüsselte Wert for(int a: aValues) { // Gehe durch alle Werte, die a annehmen kann for(int b = 0; b < 26; b++) { // Gehe durch alle Werte, die b annehmen kann d = decrypt(cipher, a, b); // Ruft die Entschlüsselungsfunktion auf // Die folgende Fallunterscheidung prüft gegen einen bekannten Teil des Inhalts // Diese Zeile kann weggelassen werden, um alle Ergebnisse zu zeigen. if(d.indexOf("ODER") > 0) System.out.println(d + " k = (" + a + ", " + b + ")"); } } } public static void main(String[] args) { // Entschlüssele den String mit bekanntem Schlüssel System.out.println("1.) " + decrypt("GWDPCTLSDJWGJBNWJLKOJLJWEPBDBGEDJSHJBLCT", 5, 15)); // Entschlüssele den String mithilfe von Bruteforce System.out.print("2.) "); bruteforce("BLUWXTSBMSBZVXUWZMSRWLUAZMUXZKNARSZMNHBWWRABZMA"); } /* Programmausgabe: 1.) TRIANGULIERTESKREUZFEUERDASISTDIELOESUNG 2.) ICHLASDIRDIEWAHLERDOLCHTERHAENGTODERGUILLOTIERT k = (7, 23) */ }