public static byte[] CreateIV(string salt, string secretKey)
        {
            var saltBytes          = Convert.FromBase64String(salt);
            var secretKeyHashBytes = Utils.CreateMD5Hash(TextEncoding.GetBytes(secretKey));

            //calculate offset of secretKeyHashBytes by summ of
            //first secretKeyByte and first salt byte in proportion to 256
            var offset = (int)(((secretKeyHashBytes[0] + saltBytes[0]) / 256d) * 16);

            if (offset > 16)
            {
                offset -= 16;
            }
            var targetSecretKeyBytes = new byte[8];

            for (var i = 0; i < targetSecretKeyBytes.Length; i++)
            {
                var index = offset + i;
                if (index >= 8)
                {
                    index -= 8;
                }
                targetSecretKeyBytes[i] = secretKeyHashBytes[index];
            }
            var buff = new byte[16];
            var odd  = secretKeyHashBytes[0] > 123; //half byte

            for (var i = 0; i < buff.Length; i++)
            {
                buff[i] = odd ? targetSecretKeyBytes[i / 2] : saltBytes[i / 2];
                odd     = !odd;
            }

            return(buff);
        }