From cc56343a75297fa39b3d215804b6145ef00ff1ed Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Tue, 19 Jan 2016 12:03:36 +0100 Subject: EiP 10.2 --- ws2015/eip/blaetter/10/2/PasswordCracker.java | 36 ++++++++++++++++++++++ .../eip/blaetter/10/2/PasswordCrackerThread.java | 29 +++++++++++++++++ ws2015/eip/blaetter/10/2/SHA.java | 28 +++++++++++++++++ ws2015/eip/blaetter/10/2/Synchronizer.java | 22 +++++++++++++ ws2015/eip/blaetter/10/manifest | 2 ++ 5 files changed, 117 insertions(+) create mode 100644 ws2015/eip/blaetter/10/2/PasswordCracker.java create mode 100644 ws2015/eip/blaetter/10/2/PasswordCrackerThread.java create mode 100644 ws2015/eip/blaetter/10/2/SHA.java create mode 100644 ws2015/eip/blaetter/10/2/Synchronizer.java create mode 100644 ws2015/eip/blaetter/10/manifest (limited to 'ws2015') diff --git a/ws2015/eip/blaetter/10/2/PasswordCracker.java b/ws2015/eip/blaetter/10/2/PasswordCracker.java new file mode 100644 index 0000000..0c7c094 --- /dev/null +++ b/ws2015/eip/blaetter/10/2/PasswordCracker.java @@ -0,0 +1,36 @@ +public class PasswordCracker { + + // dies ist der laut Angabe bekannte Hashwert des Passworts + public static final String HASH = "ef937752f7348a964445f60857009f881983a6af"; + + public static void main(String[] args) { + int numProcs = Runtime.getRuntime().availableProcessors(); + Thread[] workers = new Thread[numProcs]; + + Synchronizer sync = new Synchronizer(HASH); + + for (int i = 0; i < numProcs; i++) { + workers[i] = new Thread(new PasswordCrackerThread(sync, rangeBound(numProcs, i), rangeBound(numProcs, i + 1) - 1)); + workers[i].start(); + } + + synchronized (sync) { + while (! sync.hasSolution()) { + try { + sync.wait(); + } catch (InterruptedException e) {} + } + } + + for (Thread w : workers) + w.interrupt(); + + System.out.println("Guessed this password: " + sync.getSolution()); + System.exit(0); + } + + public static long rangeBound(int n, int i) { + long upperBound = (long) 1e8; + return n == i ? upperBound + 1 : (upperBound / n) * i; + } +} diff --git a/ws2015/eip/blaetter/10/2/PasswordCrackerThread.java b/ws2015/eip/blaetter/10/2/PasswordCrackerThread.java new file mode 100644 index 0000000..dcc0656 --- /dev/null +++ b/ws2015/eip/blaetter/10/2/PasswordCrackerThread.java @@ -0,0 +1,29 @@ +import java.util.Formatter; + +public class PasswordCrackerThread implements Runnable { + + public final long rangeStart; + public final long rangeEnd; + + public final Synchronizer sync; + + public PasswordCrackerThread(Synchronizer s, long start, long end) + { + sync = s; + rangeStart = start; + rangeEnd = end; + } + + public void run() { + for (long i = rangeStart; i <= rangeEnd; i++) { + String guess = new Formatter().format("%8d", i).toString(); + String digest = SHA.encrypt(guess); + if (digest.equals(sync.targetHash)) { + synchronized (sync) { + sync.setSolution(i); + break; + } + } + } + } +} diff --git a/ws2015/eip/blaetter/10/2/SHA.java b/ws2015/eip/blaetter/10/2/SHA.java new file mode 100644 index 0000000..ad40f99 --- /dev/null +++ b/ws2015/eip/blaetter/10/2/SHA.java @@ -0,0 +1,28 @@ +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Formatter; + +public class SHA { + + /** + * Gibt den Hashwert des Parameters zurueck - die Implementierung dieser Methode + * ist fuer diese Aufgabe *NICHT* relevant, braucht nicht weiter beachtet zu werden + * @param text auf den der Hashalgorithmus angewendet werden soll + * @return den Hashwert + */ + public static String encrypt(String text) { + try { + MessageDigest md = MessageDigest.getInstance("SHA"); + md.update(text.getBytes()); + byte[] digest = md.digest(); + + Formatter formatter = new Formatter(); + for (byte d: digest) + formatter.format("%02x", 0xFF & d); + return formatter.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/ws2015/eip/blaetter/10/2/Synchronizer.java b/ws2015/eip/blaetter/10/2/Synchronizer.java new file mode 100644 index 0000000..5efb127 --- /dev/null +++ b/ws2015/eip/blaetter/10/2/Synchronizer.java @@ -0,0 +1,22 @@ +public class Synchronizer { + public final String targetHash; + private Long solution = null; + + public Synchronizer(String hash) { targetHash = hash; } + + public synchronized void setSolution(long password) + { + solution = password; + this.notifyAll(); + } + + public synchronized long getSolution() + { + return solution; + } + + public synchronized boolean hasSolution() + { + return (solution != null); + } +} diff --git a/ws2015/eip/blaetter/10/manifest b/ws2015/eip/blaetter/10/manifest new file mode 100644 index 0000000..7a754f4 --- /dev/null +++ b/ws2015/eip/blaetter/10/manifest @@ -0,0 +1,2 @@ +1 +2 \ No newline at end of file -- cgit v1.2.3