From 91b4cfc801b7c156c231ca60aba69a8d171e9226 Mon Sep 17 00:00:00 2001 From: iximeow Date: Wed, 26 Nov 2014 18:10:58 -0800 Subject: Challenge 8, 9 --- src/solvers/Challenge8.scala | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/solvers/Challenge8.scala (limited to 'src/solvers/Challenge8.scala') 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) +} -- cgit v1.1