Username or Email
Password
Remember me
Sign in
Sign up
Add Paste
Add Collection
You are not allowed to edit this paste! A fork will be created instead.
C/C++
CSS
HTML
Markdown
PHP
Python
Text
ABAP
ActionScript
ADA
Apache Conf
AsciiDoc
Assembly x86
AutoHotKey
BatchFile
BBCode
C9Search
Clojure
Cobol
CoffeeScript
ColdFusion
C#
Curly
D
Dart
Diff
Dot
Erlang
EJS
Forth
FreeMarker
Glsl
Go
Groovy
HAML
Handlebars
Haskell
haXe
HTML (Ruby)
INI
Jack
Jade
Java
JavaScript
JSON
JSONiq
JSP
JSX
Julia
LaTeX
LESS
Liquid
Lisp
LiveScript
LogiQL
LSL
Lua
LuaPage
Lucene
Makefile
MATLAB
MEL
MySQL
MUSHCode
Nix
Objective-C
OCaml
Pascal
Perl
pgSQL
Powershell
Prolog
Properties
Protobuf
R
RDoc
RHTML
Ruby
Rust
SASS
SCAD
Scala
Scheme
SCSS
SH
SJS
Space
snippets
Soy Template
SQL
Stylus
SVG
Tcl
Tex
Textile
Toml
Twig
Typescript
VBScript
Velocity
Verilog
XML
XQuery
YAML
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) */ }
Private