unnamed file

Java

Krypto

Guest

Download Edit

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)
*/
}