summaryrefslogtreecommitdiff
path: root/src/solvers/Challenge8.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/Challenge8.scala')
-rw-r--r--src/solvers/Challenge8.scala43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/solvers/Challenge8.scala b/src/solvers/Challenge8.scala
new file mode 100644
index 0000000..5247075
--- /dev/null
+++ b/src/solvers/Challenge8.scala
@@ -0,0 +1,43 @@
+package ixee.cryptopals.solvers
+
+import scala.io.Source
+import ixee.cryptopals.utils.ByteUtils._
+import ixee.cryptopals.utils.StreamUtils._
+import ixee.cryptopals.utils.ConversionUtils._
+import ixee.cryptopals.utils.FunctionUtils._
+import ixee.cryptopals.utils._
+import io.github.marklister.base64.Base64._
+import javax.crypto.Cipher
+import javax.crypto.spec.SecretKeySpec
+
+object Challenge8 {
+ val path = "./data/8.txt"
+
+ lazy val ciphertext =
+ Source
+ .fromFile(path)
+ .getLines()
+ .toSeq
+ .map(hexStr2Bytes)
+ //.mkString
+ //.toByteArray
+
+ def run = {
+ ciphertext
+ .zipWithIndex
+ .map(x => (x._1.grouped(16).toStream, x._2 + 1)) //
+ // this might be decent, line #133 is #2 under this metric
+ // .map(x => (avgHammingDistance(x._1), x._2)).sortBy(_._1)
+ /*
+ * but looking for actual duplicate data is better:
+ * line 133 is #1 with six duplicate blocks,
+ * old #1 of 177 has 0 duplicate blocks.
+ */
+ .map(x => (dupBlocks(x._1), x._2)).sortBy(_._1 * -1)
+ .head
+ ._2
+ }
+
+ def dupBlocks(xs: Seq[Seq[Byte]]) =
+ pairsOf(xs).map(tup(_ == _)).count(_ == true)
+}