Example #1
0
        public void Challenge12_Byte_at_a_time_ECB_decryption_simple()
        {
            var secretSuffix = Convert.FromBase64String(
                "Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK");

            using (var rnd = RandomNumberGenerator.Create())
            {
                var key = new byte[16];
                rnd.GetBytes(key);

                Func <ReadOnlyMemory <byte>, byte[]> encrypt = data => MyAes.EncryptEcb(data.Span, secretSuffix, key);

                var blockSize = AesOracle.GuessBlockSize(encrypt);
                Assert.Equal(16, blockSize);

                var payload   = new byte[3 * blockSize];
                var encrypted = encrypt(payload);
                Assert.Equal(CipherMode.ECB, AesOracle.GuessMode(encrypted, blockSize));

                var calculatedPrefixLength = AesOracle.GetPrefixLength(blockSize, encrypt);
                Assert.Equal(0, calculatedPrefixLength);

                var decrypted  = AesOracle.ByteAtATimeEcb(blockSize, encrypt);
                var plainText  = Encoding.UTF8.GetString(decrypted);
                var secretText = Encoding.UTF8.GetString(secretSuffix);
                Assert.Equal(secretText, plainText);
            }
        }
Example #2
0
        public void Challenge11_ECB_CBC_DetectionOracle()
        {
            int size    = 16 * 3;
            var payload = new byte[size];

            for (int i = 0; i < 100; ++i)
            {
                var randomlyEncrypted = RandomEncryptor.Encrypt(payload);
                Assert.Equal(0, randomlyEncrypted.cipher.Length % 16);
                Assert.Equal(randomlyEncrypted.mode, AesOracle.GuessMode(randomlyEncrypted.cipher, 16));
            }
        }