使用DES對稱加密代碼,支持中文

//名稱空間 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System;

using System.Security.Cryptography;

using System.IO;

using System.Text;

 

//方法

//加密方法

public string Encrypt(string pToEncrypt, string sKey)

{

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

//把字符串放到byte數組中

//原來使用的UTF8編碼,我改成Unicode編碼了,不行

byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);

//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);

 

//建立加密對象的密鑰和偏移量

//原文使用ASCIIEncoding.ASCII方法的GetBytes方法

//使得輸入密碼必須輸入英文文本

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);

//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

StringBuilder ret = new StringBuilder();

foreach(byte b in ms.ToArray())

{

//Format as hex

ret.AppendFormat("{0:X2}", b);

}

ret.ToString();

return ret.ToString();

}

 

//解密方法

public 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(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使用的是流對象,必須把解密後的文本變成流對象

StringBuilder ret = new StringBuilder();

 

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

}

 

//-------代碼完畢--------------------

 

注意:sKey輸入密碼的時候,必須使用英文字符,區分大小寫,且字符數量是8個,不能多也不能少,否則出錯。

 

本人使用Windows2000 Server .Net Framework SP3 ,VS.Net下在asp.net下使用成功,加密解密正常!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章