示例#1
0
        public void Challenge2()
        {
            var a        = new HexString("1c0111001f010100061a024b53535009181c");
            var b        = new HexString("686974207468652062756c6c277320657965");
            var expected = "746865206b696420646f6e277420706c6179";

            var xord   = XorUtil.Xor(a.Bytes.ToArray(), b.Bytes.ToArray());
            var actual = new HexString(xord).ToString();

            Assert.AreEqual(expected, actual);
        }
示例#2
0
        public byte CrackKey(HexString hexString)
        {
            var scores = new Dictionary <byte, TextScore>();

            for (int key = 1; key < 127; key++)
            {
                var decrypted = XorUtil.Xor(hexString.Bytes.ToArray(), new[] { (byte)key });
                var plainText = System.Text.Encoding.ASCII.GetString(decrypted);
                scores.Add((byte)key, _textScoreCalculator.CalculateScore(plainText));
            }
            var ordered = scores.OrderByDescending(x => x.Value.Score);

            return(ordered.First().Key);
        }
示例#3
0
        public void Challenge3()
        {
            string input          = "1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736";
            var    expectedKey    = (byte)88;
            var    expectedString = "Cooking MC's like a pound of bacon";
            var    hexString      = new HexString(input);
            var    decryptor      = new SingleByteXorCracker(new BigramCalculator());

            var actualKey      = decryptor.CrackKey(hexString);
            var decryptedBytes = XorUtil.Xor(hexString.Bytes.ToArray(), new[] { actualKey });
            var actualString   = System.Text.Encoding.ASCII.GetString(decryptedBytes);

            Assert.AreEqual(expectedKey, actualKey);
            Assert.AreEqual(expectedString, actualString);
        }
示例#4
0
        public void Callenge6()
        {
            var expectedString    = "";//Set1Data.Challenge6Solution;
            var expectedKey       = System.Text.Encoding.ASCII.GetBytes("Terminator X: Bring the noise");
            var input             = Set1Data.Challenge6Input.Replace("\r\n", string.Empty);
            var encryptedData     = Convert.FromBase64String(input);
            var singleByteCracker = new SingleByteXorCracker(new BigramCalculator());
            var cracker           = new MultiByteXorCracker(singleByteCracker);

            var actualKey     = cracker.CrackKey(encryptedData);
            var decryptedData = XorUtil.Xor(encryptedData, actualKey);
            var actualString  = System.Text.Encoding.ASCII.GetString(decryptedData);

            Assert.AreEqual(expectedString, actualString);
            Assert.AreEqual(expectedKey, actualKey);
        }
示例#5
0
        public void Challenge5()
        {
            var input =
                "Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal";
            var key      = "ICE";
            var expected =
                "0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f";
            var inputBytes        = System.Text.Encoding.ASCII.GetBytes(input);
            var keyBytes          = System.Text.Encoding.ASCII.GetBytes(key);
            var expectedHexString = new HexString(expected);

            var actualBytes     = XorUtil.Xor(inputBytes, keyBytes);
            var actualHexString = new HexString(actualBytes);

            CollectionAssert.AreEqual(expectedHexString.Bytes.ToArray(), actualBytes);
            Assert.AreEqual(expectedHexString.ToString(), actualHexString.ToString());
        }
示例#6
0
        public static byte[] Encrypt(byte[] key, byte[] nonce, byte[] data)
        {
            ulong counter   = 0;
            var   keyStream = new byte[BlockSizeBytes];
            var   blocks    = data.Chunks(BlockSizeBytes);
            var   xord      = new List <byte>(data.Length);

            foreach (var block in blocks)
            {
                var counterBytes = BitConverter.GetBytes(counter);
                Array.Copy(nonce, keyStream, nonce.Length);
                Array.Copy(counterBytes, 0, keyStream, nonce.Length, counterBytes.Length);
                var blockKey = AesEcb.Encrypt(key, keyStream);
                xord.AddRange(XorUtil.Xor(block, blockKey));
                counter++;
            }
            return(xord.ToArray());
        }
示例#7
0
        public void Challenge4()
        {
            var expectedString = "Now that the party is jumping\n";
            var expectedKey    = 53;
            var strings        = Set1Data.Challenge4Input.Split(new[]
            {
                '\n', '\r'
            }, StringSplitOptions.RemoveEmptyEntries);

            var hexStrings = strings.Select(s => new HexString(s)).ToArray();
            ITextScoreCalculator textScoreCalculator = new BigramCalculator();
            var cracker = new SingleByteXorCracker(textScoreCalculator);
            int index;
            var actualKey = cracker.CrackKey(hexStrings, out index);

            var decrytedBytes = XorUtil.Xor(hexStrings[index].Bytes.ToArray(), new[] { actualKey });
            var actualString  = System.Text.Encoding.ASCII.GetString(decrytedBytes);

            Assert.AreEqual(expectedString, actualString);
            Assert.AreEqual(expectedKey, actualKey);
        }
示例#8
0
        public static byte[] Decrypt(byte[] key, byte[] iv, byte[] data, bool removePadding = true)
        {
            var blocks        = data.Chunks(BlockSizeBytes);
            var clearText     = new byte[data.Length];
            int index         = 0;
            var previousBlock = iv;

            foreach (var block in blocks)
            {
                var blockArray = block.ToArray();
                var decrypted  = AesEcb.Decrypt(key, blockArray);
                var xord       = XorUtil.Xor(decrypted, previousBlock);
                Array.Copy(xord, 0, clearText, index, BlockSizeBytes);
                previousBlock = blockArray;
                index        += BlockSizeBytes;
            }
            if (removePadding)
            {
                return(PaddingUtil.RemovePad(clearText));
            }
            return(clearText);
        }
示例#9
0
        public static byte[] Encrypt(byte[] key, byte[] iv, byte[] data)
        {
            int paddingLength = BlockSizeBytes - (data.Length % BlockSizeBytes);

            paddingLength = paddingLength == 0 ? BlockSizeBytes : paddingLength;
            int cipherTextLength = data.Length + paddingLength;
            var cipherText       = new byte[cipherTextLength];
            var paddedData       = PaddingUtil.Pad(data, BlockSizeBytes);
            var blocks           = paddedData.Chunks(BlockSizeBytes);
            int index            = 0;
            var previousBlock    = iv;

            foreach (var block in blocks)
            {
                var xord      = XorUtil.Xor(block.ToArray(), previousBlock);
                var encrypted = AesEcb.Encrypt(key, xord);
                Array.Copy(encrypted, 0, cipherText, index, BlockSizeBytes);
                previousBlock = encrypted;
                index        += BlockSizeBytes;
            }
            return(cipherText);
        }
示例#10
0
        public byte CrackKey(HexString[] hexStrings, out int index)
        {
            int currentMax = 0;

            index = -1;
            byte bestKey = 0;

            for (int i = 0; i < hexStrings.Length; i++)
            {
                var hexString = hexStrings[i];
                var key       = CrackKey(hexString);
                var decrypted = XorUtil.Xor(hexString.Bytes.ToArray(), new[] { key });
                var plainText = System.Text.Encoding.ASCII.GetString(decrypted);
                var score     = _textScoreCalculator.CalculateScore(plainText);
                if (score.Score > currentMax)
                {
                    currentMax = score.Score;
                    bestKey    = key;
                    index      = i;
                }
            }
            return(bestKey);
        }