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); }
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); }
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); }
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); }
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()); }
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()); }
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); }
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); }
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); }
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); }