From aa390776b26d794ab37aa13833fa7043aad16504 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sun, 23 Nov 2014 03:09:27 -0800 Subject: Add in code for challenge 3 --- src/solvers/XorDecrypt.scala | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/solvers/XorDecrypt.scala (limited to 'src/solvers') diff --git a/src/solvers/XorDecrypt.scala b/src/solvers/XorDecrypt.scala new file mode 100644 index 0000000..b7f7c43 --- /dev/null +++ b/src/solvers/XorDecrypt.scala @@ -0,0 +1,29 @@ +package ixee.cryptopals.solvers + +import ixee.cryptopals.utils._ +import ixee.cryptopals.utils.ByteUtils._ + +object XorDecrypt { + implicit val freq = Frequencies.cornell40kSample + + def tryBestDecrypt(ciphertext: Seq[Byte]) = { + val key = findBestSingleByteKey(ciphertext) + new String((ciphertext xor Stream.continually(key)).toArray) + } + + def findBestSingleByteKey(ciphertext: Seq[Byte]): Byte = + candidates(ciphertext) + .minBy(_._1)._2.toByte + + def candidates(ciphertext: Seq[Byte]) = + (0 until 256) + .map(_.toByte) + .map(x => TextScorer.score(ciphertext xor Stream.continually(x))) + .zipWithIndex + .filter(_._1 != -1.0) + + def candidatesAsAscii(ciphertext: Seq[Byte]) = + candidates(ciphertext).sortBy(_._1).map(x => + new String((ciphertext xor Stream.continually(x._2.toByte)).toArray) + ) +} -- cgit v1.1