/// <summary>
        /// Decrypts a set of Taylor Swift lyrics into the original byte data.
        /// </summary>
        /// <param name="data">The string representation of the Taylor Swift lyrics to decrypt.</param>
        /// <param name="key">The 256 bit Key used to encrypt the data.</param>
        /// <param name="iv">The 128 bit IV used to encrypt the data.</param>
        public byte[] Decrypt(string data, byte[] key, byte[] iv)
        {
            // Validate key parameter
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            if (key.Length == 0)
            {
                throw new ArgumentException("The key parameter can not be empty.", "key");
            }
            if (key.Length * 8 != KeyBitSize)
            {
                throw new ArgumentException($"The key parameter must be {KeyBitSize} bits long.", "key");
            }

            // Validate iv parameter
            if (iv == null)
            {
                throw new ArgumentNullException("iv");
            }
            if (iv.Length == 0)
            {
                throw new ArgumentException("The iv parameter can not be empty.", "iv");
            }
            if (iv.Length * 8 != BlockBitSize)
            {
                throw new ArgumentException($"The iv parameter must be {BlockBitSize} bits long.", "iv");
            }

            // Get fingerprint id's from the fingerprint strings
            var fingerprintIds = new List <int>();

            foreach (var lyric in data.Split('\n'))
            {
                if (lyric.Trim() == string.Empty)
                {
                    continue;
                }

                fingerprintIds.Add(
                    _fingerprintManager.GetIndexOfFingerprint(
                        _fingerprintManager.GetFromLyric(lyric)));
            }

            var bitArray = new BitArray(fingerprintIds.Count * 10);
            var index    = 0;

            foreach (var x in fingerprintIds)
            {
                var arr = new BitArray(new int[] { x });
                bitArray.Set(index++, arr.Get(0));
                bitArray.Set(index++, arr.Get(1));
                bitArray.Set(index++, arr.Get(2));
                bitArray.Set(index++, arr.Get(3));
                bitArray.Set(index++, arr.Get(4));
                bitArray.Set(index++, arr.Get(5));
                bitArray.Set(index++, arr.Get(6));
                bitArray.Set(index++, arr.Get(7));
                bitArray.Set(index++, arr.Get(8));
                bitArray.Set(index++, arr.Get(9));
            }

            var encryptedData = bitArray.ToByteArray();

            // Remove Padding from encrypted data
            var paddingLength = encryptedData[encryptedData.Length - 1];

            Array.Resize(ref encryptedData, encryptedData.Length - paddingLength);

            // Decrypt Data
            var decryptedData = DecryptPayload(encryptedData, key, iv);

            return(decryptedData);
        }