From 47888049de29336c3f753d0372b37923d8c71121 Mon Sep 17 00:00:00 2001 From: iximeow Date: Fri, 28 Nov 2014 04:22:20 -0800 Subject: Challenge 11 --- test/Gloria.scala | 33 +++++++++++++++++++++++++++++++++ test/Set2Spec.scala | 11 +++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/Gloria.scala (limited to 'test') diff --git a/test/Gloria.scala b/test/Gloria.scala new file mode 100644 index 0000000..3141a3a --- /dev/null +++ b/test/Gloria.scala @@ -0,0 +1,33 @@ +package ixee.cryptopals.test + +import ixee.cryptopals.utils._ +import CryptoUtils._ +import crypto.SchemeBuilder + +object Gloria { + + val decide = new java.util.Random() + + def encryptify(input: Seq[Byte]): (String, Seq[Byte]) = { + val mode = if (Gloria.decide.nextBoolean) "ECB" else "CBC" + + val betterText = + Gloria.say(atLeast = 5, atMost = 10) ++ input ++ Gloria.say(atLeast = 5, atMost = 10) + + val builder = SchemeBuilder("AES", Gloria.sayExactly(16)) + + val encryptor = + if (mode == "ECB") ecbEncrypt(builder.ecb) _ + else cbcEncrypt(builder.cbc(Gloria.sayExactly(16))) _ + + (mode, encryptor(betterText)) + } + + def voice: Iterator[Byte] = Stream.continually(Gloria.decide.nextInt.toByte).iterator + + def sayExactly(n: Int) = voice.take(n).toSeq + + def say(atLeast: Int, atMost: Int): Seq[Byte] = + (voice.take(atLeast) ++ voice.take(Gloria.decide.nextInt(atMost - atLeast))).toSeq + +} diff --git a/test/Set2Spec.scala b/test/Set2Spec.scala index d230a18..156949b 100644 --- a/test/Set2Spec.scala +++ b/test/Set2Spec.scala @@ -73,6 +73,17 @@ class Set2Spec extends IxeeSpec { } } + + "Challenge 11: ECB/CBC detection" - { + + val input = "keke" * 32 + + val (mode, ciphertext) = Gloria.encryptify(input.asBytes) + + CryptoUtils.detectMode(ciphertext) mustBe mode // ...always. + + } + } } -- cgit v1.1