c# DES加密解密算法

/// <summary>
/// 使用DES加密指定字符串
/// </summary>
/// <param name="encryptStr">待加密的字符串</param>
/// <param name="key">密鑰(最大長度8)</param>
/// <param name="IV">初始化向量(最大長度8)</param>
/// <returns>加密後的字符串</returns>
public static string DESEncrypt(string encryptStr,string key,string IV)
{
//將key和IV處理成8個字符
key += "12345678";
IV += "12345678";
key = key.Substring(0,8);
IV = IV.Substring(0,8);

SymmetricAlgorithm sa;
ICryptoTransform ict;
MemoryStream ms;
CryptoStream cs;
byte[] byt;

sa = new DESCryptoServiceProvider();
sa.Key = Encoding.UTF8.GetBytes(key);
sa.IV = Encoding.UTF8.GetBytes(IV);
ict = sa.CreateEncryptor();

byt = Encoding.UTF8.GetBytes(encryptStr);

ms = new MemoryStream();
cs = new CryptoStream(ms, ict, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();

cs.Close();

//加上一些干擾字符
string retVal = Convert.ToBase64String(ms.ToArray());
System.Random ra = new Random();

for (int i=0;i<8;i++)
{
int radNum = ra.Next(36);
char radChr = Convert.ToChar(radNum + 65);//生成一個隨機字符

retVal = retVal.Substring(0,2*i+1) + radChr.ToString() + retVal.Substring(2*i+1);
}

return retVal;
}

/// <summary>
/// 使用DES解密指定字符串
/// </summary>
/// <param name="encryptedValue">待解密的字符串</param>
/// <param name="key">密鑰(最大長度8)</param>
/// <param name="IV">初始化向量(最大長度8)</param>
/// <returns>解密後的字符串</returns>
public static string DESDecrypt(string encryptedValue,string key,string IV)
{
//去掉干擾字符
string tmp = encryptedValue;
if (tmp.Length < 16)
{
  return "";
}

for (int i=0;i<8;i++)
{
  tmp = tmp.Substring(0,i+1) + tmp.Substring(i+2);
}
encryptedValue = tmp;

//將key和IV處理成8個字符
key += "12345678";
IV += "12345678";
key = key.Substring(0,8);
IV = IV.Substring(0,8);

SymmetricAlgorithm sa;
ICryptoTransform ict;
MemoryStream ms;
CryptoStream cs;
byte[] byt;

try
{
  sa = new DESCryptoServiceProvider();
  sa.Key = Encoding.UTF8.GetBytes(key);
  sa.IV = Encoding.UTF8.GetBytes(IV);
  ict = sa.CreateDecryptor();

  byt = Convert.FromBase64String(encryptedValue);

  ms = new MemoryStream();
  cs = new CryptoStream(ms, ict, CryptoStreamMode.Write);
  cs.Write(byt, 0, byt.Length);
  cs.FlushFinalBlock();

  cs.Close();

  return Encoding.UTF8.GetString(ms.ToArray());
}
catch (System.Exception)
{
  return "";
}

}

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