public static byte[] EncryptProfileFor(string email) { var profile = ProfileFor(email); var bytes = System.Text.Encoding.ASCII.GetBytes(profile); var padded = PaddingUtil.Pad(bytes, BlockSizeBytes); return(AesEcb.Encrypt(Key, padded)); }
public static Dictionary <string, string> DecryptProfile(byte[] encrypted) { var decrypted = AesEcb.Decrypt(Key, encrypted); var encoded = PaddingUtil.RemovePad(decrypted); var decoded = KvpParser.Decode(System.Text.Encoding.ASCII.GetString(encoded)); return(decoded); }
private static byte[] EncryptionOracle(byte[] data) { var combined = new List <byte>(); combined.AddRange(data); combined.AddRange(Convert.FromBase64String(EncodedSuffix)); var padded = PaddingUtil.Pad(combined.ToArray(), BlockSizeBytes); return(AesEcb.Encrypt(Key, padded)); }
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)); }
private static byte[] EncryptionOracle(byte[] data) { if (_randomPrefix == null || _randomPrefix.Length == 0) { var r = new Random(); var prefixLength = r.Next(1, MaxPrefixLength + 1); _randomPrefix = SecureRng.GenerateRandomBytes(prefixLength); } var combined = new List <byte>(); combined.AddRange(_randomPrefix); combined.AddRange(data); combined.AddRange(Convert.FromBase64String(EncodedSuffix)); var padded = PaddingUtil.Pad(combined.ToArray(), BlockSizeBytes); return(AesEcb.Encrypt(Key, padded)); }
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 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 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); }