diff --git a/src/ch/kousz/adrian/encfs/EncFSBrute.java b/src/ch/kousz/adrian/encfs/EncFSBrute.java index 866f1e8..ff7fd5e 100644 --- a/src/ch/kousz/adrian/encfs/EncFSBrute.java +++ b/src/ch/kousz/adrian/encfs/EncFSBrute.java @@ -1,7 +1,11 @@ package ch.kousz.adrian.encfs; +import ch.kousz.adrian.util.LineIterable; import ch.kousz.adrian.util.StringGenerator; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; import org.mrpdaemon.sec.encfs.EncFSBinaryConfig; import org.mrpdaemon.sec.encfs.EncFSConfig; import org.mrpdaemon.sec.encfs.EncFSConfigParser; @@ -12,14 +16,30 @@ public class EncFSBrute public static void main(String[] args) throws Exception { + if (args.length < 3) { + System.out.println("USAGE: EncFSBrute "); + System.out.println("or: EncFSBrute \"wordlist\" "); + return; + } + String filename = args[0]; String charset = args[1]; - int minLength = Integer.parseInt(args[2]); + String param = args[2]; + + Iterable passwordGenerator; + + if ("wordlist".equals(charset)) { + BufferedReader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(param), "UTF-8")); + passwordGenerator = new LineIterable(rdr); + } else { + int minLength = Integer.parseInt(param); + passwordGenerator = new StringGenerator(charset, minLength); + } EncFSConfig config = EncFSConfigParser.parseFile(new File(filename)); EncFSBinaryConfig binaryConfig = EncFSBinaryConfig.from(config); - for (String pw: new StringGenerator(charset, minLength)) { + for (String pw: passwordGenerator) { System.err.println("Trying: " + pw); boolean ok = EncFSUtil.checkPassword(binaryConfig, pw); if (ok) { diff --git a/src/ch/kousz/adrian/util/LineIterable.java b/src/ch/kousz/adrian/util/LineIterable.java new file mode 100644 index 0000000..89b5289 --- /dev/null +++ b/src/ch/kousz/adrian/util/LineIterable.java @@ -0,0 +1,63 @@ +package ch.kousz.adrian.util; + +import java.io.BufferedReader; +import java.io.IOException; + +public class LineIterable +implements Iterable +{ + private final BufferedReader rdr; + + public LineIterable(BufferedReader rdr) + { + this.rdr = rdr; + } + + @Override + public java.util.Iterator iterator() + { + return new LineIterable.Iterator(this); + } + + private static class Iterator + implements java.util.Iterator + { + private final BufferedReader rdr; + private String next; + + public Iterator(LineIterable gen) + { + this.rdr = gen.rdr; + readNext(); + } + + @Override + public boolean hasNext() + { + return next != null; + } + + @Override + public String next() + { + String result = next; + readNext(); + return result; + } + + @Override + public void remove() + { + throw new UnsupportedOperationException(); + } + + private void readNext() + { + try { + next = rdr.readLine(); + } catch (IOException ex) { + throw Throwables.sneakyThrow(ex); + } + } + } +} diff --git a/src/ch/kousz/adrian/util/Throwables.java b/src/ch/kousz/adrian/util/Throwables.java new file mode 100644 index 0000000..be4cc22 --- /dev/null +++ b/src/ch/kousz/adrian/util/Throwables.java @@ -0,0 +1,16 @@ + +package ch.kousz.adrian.util; + +public class Throwables +{ + public static RuntimeException sneakyThrow(Throwable t) + { + Throwables.sneakyThrowNow(t); + return null; + } + + @SuppressWarnings("unchecked") + private static T sneakyThrowNow(Throwable t) throws T { + throw (T) t; + } +}