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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
        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());
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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);
        }