public static bool ConfirmEcbMode(int blockSize) { var b = SecureRng.GenerateRandomBytes(blockSize); var duplicateBlocks = new List <byte>(); duplicateBlocks.AddRange(b); duplicateBlocks.AddRange(b); var encrypted = EncryptionOracle(duplicateBlocks.ToArray()); return(AesEcb.IsEcbEncrypted(encrypted, blockSize)); }
public static CipherMode EncryptEcbOrCbc(byte[] data, out CipherMode actualMode) { actualMode = Rand.Next(0, 2) == 0 ? CipherMode.ECB : CipherMode.CBC; var key = SecureRng.GenerateRandomBytes(KeySizeBytes); // Add prefix and suffix to data data = TransformData(data); byte[] encrypted; if (actualMode == CipherMode.ECB) { var padded = PaddingUtil.Pad(data, BlockSizeBytes); encrypted = AesEcb.Encrypt(key, padded); } else { var iv = SecureRng.GenerateRandomBytes(BlockSizeBytes); encrypted = AesCbc.Encrypt(key, iv, data); } var guessedMode = AesEcb.IsEcbEncrypted(encrypted, BlockSizeBytes) ? CipherMode.ECB : CipherMode.CBC; return(guessedMode); }