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