在C#中直接引用加密类库比在C中要方便和快速
des_demo.cs代码如下:
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

public class EncryptStringDES {

#region 加密方法
   //pToEncrypt为需要加密字符串,sKey为密钥
   public string Encrypt(string pToEncrypt, string sKey)
   {
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   //把字符串放到byte数组中
   //原来使用的UTF8编码,我改成Unicode编码了,不行
   byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
   //建立加密对象的密钥和偏移量
   //使得输入密码必须输入英文文本
   des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
   des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   StringBuilder ret = new StringBuilder();
   foreach(byte b in ms.ToArray())
   {
   ret.AppendFormat('{0:X2}', b);
   }
   ret.ToString();
   return ret.ToString();
   }
   #endregion
   #region 解密方法
   //pToDecrypt为需要解密字符串,sKey为密钥
   public string Decrypt(string pToDecrypt, string sKey)
   {
   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   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 = (byte)i;
   }
   //建立加密对象的密钥和偏移量,此值重要,不能修改
   des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
   des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
   MemoryStream ms = new MemoryStream();
   CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);
   cs.Write(inputByteArray, 0, inputByteArray.Length);
   cs.FlushFinalBlock();
   //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
   StringBuilder ret = new StringBuilder();
   return System.Text.Encoding.Default.GetString(ms.ToArray());
   }
   #endregion
}
注意,sKey为一个长度为八位的字符串,加密和解密时必须一致.为了加强模糊度,我们可以在程序初始化时用不可打印ascii码组合连接得到sKey,如下所示:
   int[] tmp=new int[8]{23,234,195,165,201,240,143,198};
   foreach(int i in tmp)
   {
   sKey+=((char)i).ToString();
   }

 

posted on 2011-02-12 14:20  Berthing  阅读(750)  评论(0)    收藏  举报