sign4

#region 加解密
  /// <summary>
  /// 加密
  /// </summary>
  /// <param name="pToEncrypt">need encrypt</param>
  /// <param name="sKey">key</param>
  /// <returns>string</returns>
  public static string Encrypt(string pToEncrypt, string sKey)
  {
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   //把字符串放倒byte數組中
   //原來使用的UTF8編碼,改成Unicode編碼不行
   byte[] inputByteArray = System.Text.Encoding.Default.GetBytes(pToEncrypt);
   //byte[]  inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);  

   //建立加密對象的密鑰和偏移量
   //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
   //使得輸入密碼必須輸入英文文本
   //   des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);  
   //   des.IV  =  ASCIIEncoding.ASCII.GetBytes("12345678");

   byte[] sx = System.Text.Encoding.UTF8.GetBytes(sKey);
   if (sx.Length != 8)
   {
    if (sx.Length > 8)
    {
     des.Key = new byte[] { sx[0], sx[1], sx[2], sx[3], sx[4], sx[5], sx[6], sx[7] };
     des.IV = new byte[] { sx[0], sx[1], sx[2], sx[3], sx[4], sx[5], sx[6], sx[7] };
    }
    else
    {
    }
   }
   else
   {
    des.Key = System.Text.Encoding.UTF8.GetBytes(sKey);
    des.IV = System.Text.Encoding.UTF8.GetBytes(sKey);
   }
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
   //Write  the  byte  array  into  the  crypto  stream  
   //(It  will  end  up  in  the  memory  stream)  
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   //Get  the  data  back  from  the  memory  stream,  and  into  a  string  
   System.Text.StringBuilder ret = new System.Text.StringBuilder();
   foreach (byte b in ms.ToArray())
   {
    //Format  as  hex  
    ret.AppendFormat("{0:X2}", b);
   }
   ret.ToString();
   return ret.ToString();
  }

  /// <summary>
  /// 解密
  /// </summary>
  /// <param name="pToDecrypt">decrypt string </param>
  /// <param name="sKey">key</param>
  /// <returns>string</returns>
  public static string Decrypt(string pToDecrypt, string sKey)
  {
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();

   //Put  the  input  string  into  the  byte  array  
   byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
   for (int x = 0; x < pToDecrypt.Length / 2; x++)
   {
    int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
    inputByteArray[x] = (byte)i;
   }

   //建立加密對象的密鑰和偏移量,此值重要,不能修改
   //   des.Key =  ASCIIEncoding.ASCII.GetBytes(sKey);  
   //   des.IV  =  ASCIIEncoding.ASCII.GetBytes("12345678");
   byte[] sx = System.Text.Encoding.UTF8.GetBytes(sKey);
   if (sx.Length != 8)
   {
    if (sx.Length > 8)
    {
     des.Key = new byte[] { sx[0], sx[1], sx[2], sx[3], sx[4], sx[5], sx[6], sx[7] };
     des.IV = new byte[] { sx[0], sx[1], sx[2], sx[3], sx[4], sx[5], sx[6], sx[7] };
    }
    else
    {
    }
   }
   else
   {
    des.Key = System.Text.Encoding.UTF8.GetBytes(sKey);
    des.IV = System.Text.Encoding.UTF8.GetBytes(sKey);
   }

   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
   //Flush  the  data  through  the  crypto  stream  into  the  memory  stream  
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();

   //Get  the  decrypted  data  back  from  the  memory  stream  
   //建立StringBuild對象,CreateDecrypt使用的是流對象,必須把解密後的文本變成流對象
   System.Text.StringBuilder ret = new System.Text.StringBuilder();

   return System.Text.Encoding.Default.GetString(ms.ToArray());
  }
  #endregion
 }
}

posted on 2009-01-05 14:54  ChinaLeo  阅读(141)  评论(0)    收藏  举报

导航