.net框架由于擁有clr提供的豐富庫支持,只需很少的代碼即可實現先前使用c等舊式語言很難實現的加密算法。本類實現一些常用機密算法,供參考。其中md5算法返回int的tostring字串。返回數字字母型結果的算法參見之前blog文章。
using system;
using system.io;
using system.data;
using system.text;
using system.diagnostics;
using system.security;
using system.security.cryptography;
namespace com.quickline.encrypt
{
 /// <summary>
 /// 類名:hashencrypt
 /// 作用:對傳入的字符串進行hash運算,返回通過hash算法加密過的字串。
 /// 屬性:[無]
 /// 構造函數額參數:
 /// isreturnnum:是否返回為加密后字符的byte代碼
 /// iscasesensitive:是否區分大小寫。
 /// 方法:此類提供md5,sha1,sha256,sha512等四種算法,加密字串的長
度依次增大。
 /// </summary>
 public class hashencrypt
 {
  //private string strin;
  private bool isreturnnum;
  private bool iscasesensitive;
  
  public hashencrypt(bool iscasesensitive,bool isreturnnum)
  {
   this.isreturnnum = isreturnnum;
   this.iscasesensitive = iscasesensitive;
  }
  
  
  private string getstrin(string strin)
  {
   //string strin = strin;
   if (strin.length == 0)
   {
    strin = "~null~";
   }
   if (iscasesensitive == false)
   {
    strin = strin.toupper();
   }
   return strin;
  }
  public string md5encrypt(string strin)
  {
   //string strin = getstrin(strin);
   byte[] tmpbyte;
   md5 md5 = new md5cryptoserviceprovider();
   tmpbyte =
md5.computehash(getkeybytearray(getstrin(strin)));
   md5.clear();
return getstringvalue(tmpbyte);
  }
  
  public string sha1encrypt(string strin)
  {
   //string strin = getstrin(strin);
   byte[] tmpbyte;
   sha1 sha1 = new sha1cryptoserviceprovider();
   tmpbyte = sha1.computehash(getkeybytearray(strin));
   sha1.clear();
return getstringvalue(tmpbyte);
}
  public string sha256encrypt(string strin)
  {
   //string strin = getstrin(strin);
   byte[] tmpbyte;
   sha256 sha256 = new sha256managed();
   tmpbyte =
sha256.computehash(getkeybytearray(strin));
   sha256.clear();
return getstringvalue(tmpbyte);
}
  public string sha512encrypt(string strin)
  {
   //string strin = getstrin(strin);
   byte[] tmpbyte;
   sha512 sha512 = new sha512managed();
   tmpbyte =
sha512.computehash(getkeybytearray(strin));
   sha512.clear();
return getstringvalue(tmpbyte);
  }
  
  /// <summary>
  /// 使用des加密(added by niehl 2005-4-6)
  /// </summary>
  /// <param name="originalvalue">待加密的字符串</param>
  /// <param name="key">密鑰(最大長度8)</param>
  /// <param name="iv">初始化向量(最大長度8)</param>
  /// <returns>加密后的字符串</returns>
  public string desencrypt(string originalvalue,string key,string iv)
  {
   //將key和iv處理成8個字符
   key += "12345678";
   iv += "12345678";
   key = key.substring(0,8);
   iv = iv.substring(0,8);
   symmetricalgorithm sa;
   icryptotransform ct;
   memorystream ms;
   cryptostream cs;
   byte[] byt;
   sa = new descryptoserviceprovider();
   sa.key = encoding.utf8.getbytes(key);
   sa.iv = encoding.utf8.getbytes(iv);
   ct = sa.createencryptor();
byt = encoding.utf8.getbytes(originalvalue);
   ms = new memorystream();
   cs = new cryptostream(ms, ct,
cryptostreammode.write);
   cs.write(byt, 0, byt.length);
   cs.flushfinalblock();
cs.close();
return convert.tobase64string(ms.toarray());
}
  public string desencrypt(string originalvalue,string key)
  {
   return desencrypt(originalvalue,key,key);
  }
  /// <summary>
  /// 使用des解密(added by niehl 2005-4-6)
  /// </summary>
  /// <param name="encryptedvalue">待解密的字符串</param>
  /// <param name="key">密鑰(最大長度8)</param>
  /// <param name="iv">m初始化向量(最大長度8)</param>
  /// <returns>解密后的字符串</returns>
  public string desdecrypt(string encryptedvalue,string key,string iv)
  {
   //將key和iv處理成8個字符
   key += "12345678";
   iv += "12345678";
   key = key.substring(0,8);
   iv = iv.substring(0,8);
   symmetricalgorithm sa;
   icryptotransform ct;
   memorystream ms;
   cryptostream cs;
   byte[] byt;
   sa = new descryptoserviceprovider();
   sa.key = encoding.utf8.getbytes(key);
   sa.iv = encoding.utf8.getbytes(iv);
   ct = sa.createdecryptor();
byt = convert.frombase64string(encryptedvalue);
   ms = new memorystream();
   cs = new cryptostream(ms, ct,
cryptostreammode.write);
   cs.write(byt, 0, byt.length);
   cs.flushfinalblock();
cs.close();
return encoding.utf8.getstring(ms.toarray());
}
  public string desdecrypt(string encryptedvalue,string key)
  {
   return desdecrypt(encryptedvalue,key,key);
  }
  private string getstringvalue(byte[] byte)
  {
   string tmpstring = "";
   if (this.isreturnnum == false)
   {
    asciiencoding asc = new asciiencoding();
    tmpstring = asc.getstring(byte);
   }
   else
   {
    int icounter;
    for
(icounter=0;icounter<byte.length;icounter++)
    {
     tmpstring = tmpstring +
byte[icounter].tostring();
    }
    
   }
   
   return tmpstring;
  }
  private byte[] getkeybytearray(string strkey)
  {
   asciiencoding asc = new asciiencoding();
   
   int tmpstrlen = strkey.length;
   byte[] tmpbyte = new byte[tmpstrlen-1];
tmpbyte = asc.getbytes(strkey);
return tmpbyte;
}
 }
}
新聞熱點
疑難解答
圖片精選