Пример #1
0
        public void Challenge007()
        {
            var lines   = File.ReadAllLines(Path.Combine(_dataPath, "Set001Challenge007.txt"));
            var content = string.Join("", lines);
            var buffer  = Buffer.FromBase64(content);

            var outputBuffer = new byte[buffer.Length];

            var aes = Aes.Create();

            aes.Mode      = CipherMode.ECB;
            aes.BlockSize = 128;
            aes.Key       = Encoding.ASCII.GetBytes("YELLOW SUBMARINE");
            aes.CreateDecryptor().TransformBlock(buffer, 0, buffer.Length, outputBuffer, 0);

            var text = new Buffer(outputBuffer).ToText();

            text.Split('\n')[0].ShouldBe("I'm back and I'm ringin' the bell ");
        }
Пример #2
0
        public void Challenge006()
        {
            var lines   = File.ReadAllLines(Path.Combine(_dataPath, "Set001Challenge006.txt"));
            var content = string.Join("", lines);
            var buffer  = Buffer.FromBase64(content);

            var likelihoods =
                Enumerable.Range(2, 40).Select(blocksize => new {
                BlockSize  = blocksize,
                Likelihood =
                    Enumerable.Range(0, 10).Select(block => {
                    var buffer1 = buffer.GetBlock(blocksize, block * 2);
                    var buffer2 = buffer.GetBlock(blocksize, block * 2 + 1);
                    return(buffer1.NormalisedHammingDistance(buffer2));
                }).Average()
            })
                .OrderBy(m => m.Likelihood);


            var blockSize = likelihoods.First().BlockSize;

            var transposed = buffer.Select((value, index) => new { Value = value, Index = index })
                             .GroupBy(x => x.Index % blockSize)
                             .Select(grp => grp.Select(x => x.Value).ToArray())
                             .Select(m => new Buffer(m))
                             .Select(m => m.EnglishScore())
                             .Select(score => Convert.ToChar(score.Byte))
                             .ToArray();

            var key     = new string(transposed);
            var message = (buffer ^ key).ToText();

            blockSize.ShouldBe(29);
            key.ShouldBe("Terminator X: Bring the noise");
            message.Split('\n')[0].ShouldBe("I'm back and I'm ringin' the bell ");
        }