/// <summary>
  /// 加密 Cookie字符串
  /// </summary>
  /// <param name="cookie">需要加密的cookie字符串</param>
  /// <param name="type"></param>
  /// <returns>加密过的cookie字符串</returns>
  public static string EncryptCookie(string cookie,int type)
  {
   string str = En(cookie,type);
   StringBuilder sb = new StringBuilder();
   foreach(char a in str)
   {  
    sb.Append(Convert.ToString(a,16).PadLeft(4,'0'));
   }
   return sb.ToString();
  }

  private static string En(string cookie,int type)
  {
   string str;
   if(type % 2==0)
   {
    str = Transform1(cookie);
   }
   else
   {
    str = Transform3(cookie);
   }
   
   str = Transform2(cookie);
   return str;
  }

  /// <summary>
  /// 解密Cookie字符串
  /// </summary>
  /// <param name="cookie">需要解密的cookie字符串</param>
  /// <param name="type"></param>
  /// <returns>解密后的cookie字符串</returns>
  public static string DecryptCookie(string cookie,int type)
  {
   StringBuilder sb = new StringBuilder();
   string [] strarr = new String[255];
   int i,j,count = cookie.Length/4;
   string strTmp;

   for(i = 0;i<count;i++)
   {
    for(j = 0;j<4;j++)
    {
     sb.Append(cookie.Substring(i*4+j,1));
    }
    strarr[i] = sb.ToString();
    sb.Remove(0,sb.Length);
   }

   for(i = 0;i<count;i++)
   {  
    strTmp = uint.Parse(strarr[i],System.Globalization.NumberStyles.AllowHexSpecifier).ToString("D");
    char ch = (char)uint.Parse(strTmp);
    sb.Append(ch);
   }

   return De(sb.ToString(),type);
  }

  private static string De(string cookie,int type)
  {
   string str;
   if(type % 2==0)
   {
    str = DeTransform1(cookie);
   }
   else
   {
    str = DeTransform3(cookie);
   }

   str = Transform2(cookie); 
   return str;
  }
  public static string Transform1(string str)
  {   
   int i=0;
   StringBuilder sb = new StringBuilder();
   
   foreach(char a in str)
   {      
    switch(i % 6)
    {
     case 0:
      sb.Append((char)(a+1));
      break;
     case 1:
      sb.Append((char)(a+5));
      break;
     case 2:
      sb.Append((char)(a+7));
      break;
     case 3:
      sb.Append((char)(a+2));
      break;
     case 4:
      sb.Append((char)(a+4));
      break;
     case 5:
      sb.Append((char)(a+9));
      break;
    }
    i++;
   }

   return sb.ToString();
  }

  public static string Transform2(string str)
  {
   uint j=0;
   StringBuilder sb = new StringBuilder();
   
   str=Reverse(str);
   foreach(char a in str)
   { 
    j=a;  
    if(j>255)
    {
     j=(uint)((a>>8) + ((a&0x0ff)<<8));
    }
    else
    {     
     j=(uint)((a>>4) + ((a&0x0f)<<4));
    }    
    sb.Append((char)j);
   }

   return sb.ToString();
  }

  public static string Transform3(string str)
  {   
   int i=0;
   StringBuilder sb = new StringBuilder();
   
   foreach(char a in str)
   {      
    switch(i % 6)
    {
     case 0:
      sb.Append((char)(a+3));
      break;
     case 1:
      sb.Append((char)(a+6));
      break;
     case 2:
      sb.Append((char)(a+8));
      break;
     case 3:
      sb.Append((char)(a+7));
      break;
     case 4:
      sb.Append((char)(a+5));
      break;
     case 5:
      sb.Append((char)(a+2));
      break;
    }
    i++;
   }

   return sb.ToString();
  }

  public static string DeTransform1(string str)
  {   
   int i=0;
   StringBuilder sb = new StringBuilder();
   
   foreach(char a in str)
   {      
    switch(i % 6)
    {
     case 0:
      sb.Append((char)(a-1));
      break;
     case 1:
      sb.Append((char)(a-5));
      break;
     case 2:
      sb.Append((char)(a-7));
      break;
     case 3:
      sb.Append((char)(a-2));
      break;
     case 4:
      sb.Append((char)(a-4));
      break;
     case 5:
      sb.Append((char)(a-9));
      break;
    }
    i++;
   }

   return sb.ToString();
  }


  public static string DeTransform3(string str)
  {   
   int i=0;
   StringBuilder sb = new StringBuilder();
   
   foreach(char a in str)
   {      
    switch(i % 6)
    {
     case 0:
      sb.Append((char)(a-3));
      break;
     case 1:
      sb.Append((char)(a-6));
      break;
     case 2:
      sb.Append((char)(a-8));
      break;
     case 3:
      sb.Append((char)(a-7));
      break;
     case 4:
      sb.Append((char)(a-5));
      break;
     case 5:
      sb.Append((char)(a-2));
      break;
    }
    i++;
   }
    return sb.ToString();
  }

public static string Reverse(string str)
  {
   int i;
   StringBuilder sb = new StringBuilder();

   for(i=str.Length-1;i>=0;i--)
   {
    sb.Append(str[i]);
   }

   return sb.ToString();
  }