diff options
author | iximeow <me@iximeow.net> | 2014-11-26 00:41:46 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2014-11-26 00:41:46 -0800 |
commit | 31cac438b1571ba6ced29af4997cf9f1f5c3c6b7 (patch) | |
tree | 882c5dd5346f246ad5487f0510ae182e14d42624 /test | |
parent | 8b3cc4835c4c77df9f207bd342ffd024f0f726e7 (diff) |
Challenge 7
Diffstat (limited to 'test')
-rw-r--r-- | test/Set1Spec.scala | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/test/Set1Spec.scala b/test/Set1Spec.scala index 628889c..b017803 100644 --- a/test/Set1Spec.scala +++ b/test/Set1Spec.scala @@ -6,6 +6,7 @@ class Set1Spec extends IxeeSpec { import ixee.cryptopals.utils.ConversionUtils._ import ixee.cryptopals.utils.ByteUtils._ + import ixee.cryptopals.utils.StreamUtils._ import ixee.cryptopals.solvers._ "Set1" - { @@ -46,6 +47,90 @@ class Set1Spec extends IxeeSpec { (("Now that the party is jumping\n", 170)) } } + + "Challenge 5: repeating-key xor" - { + val sourceText = """|Burning 'em, if you ain't quick and nimble + |I go crazy when I hear a cymbal""".stripMargin + + val key = "ICE" + + val ciphertext = + sourceText.asBytes.to[Stream] xor key.asBytes.to[Stream].continually + + ciphertext.hex mustBe( + Seq( + "0b3637272a2b2e63622c2e69", + "692a23693a2a3c6324202d62", + "3d63343c2a26226324272765", + "272a282b2f20430a652e2c65", + "2a3124333a653e2b2027630c", + "692b20283165286326302e27", + "282f" + ).mkString("") + ) + } + + "Challenge 6: break repeating-key xor" - { + + "hamming distance should be computed correctly" in { + + val textA = "this is a test" + val textB = "wokka wokka!!!" + + hammingDistance(textA, textB) mustBe 37 + + } + + "prioritizes likely key sizes" in { + + val sourceText = + """|the quick brown fox jumps over the lazy dog + |This code is going to turn out to be surprisingly useful later on. + |Breaking repeating-key XOR ("Vigenere") statistically is obviously + | an academic exercise, a "Crypto 101" thing. But more people "know + | how" to break it than can actually break it, and a similar + | technique breaks something much more important.""".stripMargin.replace("\n", "") + + val key = "ICE IS REALLY NICE" + + val ciphertext = sourceText.asByteStream xor key.asByteStream.continually + + val expectedKeySize = XorDecrypt.inferKeySize(ciphertext) + + expectedKeySize mustBe key.length + + } + + "cracks multi-byte keys" in { + val sourceText = + """|the quick brown fox jumps over the lazy dog + |This code is going to turn out to be surprisingly useful later on. + |Breaking repeating-key XOR statistically is obviously + | an academic exercise, a "Crypto 101" thing. But more people "know + | how" to break it than can actually break it, and a similar + | technique breaks something much more important.""".stripMargin.replace("\n", "") + + val key = "ICE IS REALLY NICE" + + val ciphertext = sourceText.asByteStream xor key.asByteStream.continually + + XorDecrypt.findBestMultiByteKey(ciphertext).take(key.length).asAscii mustBe key + + XorDecrypt.crackForMultiByteKey(ciphertext) mustBe sourceText + } + + "cracks the challenge text" in { + + Challenge6.run mustBe Challenge6.expectation + + } + } + + "Challenge 7: AES/ECB mode" in { + + Challenge7.run mustBe Challenge6.expectation + + } } } |