usingSystem;
usingSystem.IO;
usingSystem.Data;
usingSystem.Text;
usingSystem.Diagnostics;
usingSystem.Security;
usingSystem.Security.Cryptography;
/**//*
*.Net框架由于拥有CLR提供的丰富库支持,只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法。本类实现一些常用机密算法,供参考。其中MD5算法返回Int的ToString字串。返回数字字母型结果的算法参见之前Blog文章
*/
namespace档案数字化加工
{
/**////<summary>
///类名:HashEncrypt
///作用:对传入的字符串进行Hash运算,返回通过Hash算法加密过的字串。
///属性:[无]
///构造函数额参数:
///IsReturnNum:是否返回为加密后字符的Byte代码
///IsCaseSensitive:是否区分大小写。
///方法:此类提供MD5,SHA1,SHA256,SHA512等四种算法,加密字串的长度依次增大。
///</summary>
publicclassHashEncrypt
{
//privatestringstrIN;
privateboolisReturnNum;
privateboolisCaseSensitive;
/**////<summary>
///类初始化,此类提供MD5,SHA1,SHA256,SHA512等四种算法,加密字串的长度依次增大。
///</summary>
///<paramname="IsCaseSensitive">是否区分大小写</param>
///<paramname="IsReturnNum">是否返回为加密后字符的Byte代码</param>
publicHashEncrypt(boolIsCaseSensitive,boolIsReturnNum)
{
this.isReturnNum=IsReturnNum;
this.isCaseSensitive=IsCaseSensitive;
}
privatestringgetstrIN(stringstrIN)
{
//stringstrIN=strIN;
if(strIN.Length==0)
{
strIN="~NULL~";
}
if(isCaseSensitive==false)
{
strIN=strIN.ToUpper();
}
returnstrIN;
}
publicstringMD5Encrypt(stringstrIN)
{
//stringstrIN=getstrIN(strIN);
byte[]tmpByte;
MD5md5=newMD5CryptoServiceProvider();
tmpByte=puteHash(GetKeyByteArray(getstrIN(strIN)));
md5.Clear();
returnGetStringValue(tmpByte);
}
publicstringSHA1Encrypt(stringstrIN)
{
//stringstrIN=getstrIN(strIN);
byte[]tmpByte;
SHA1sha1=newSHA1CryptoServiceProvider();
tmpByte=puteHash(GetKeyByteArray(strIN));
sha1.Clear();
returnGetStringValue(tmpByte);
}
publicstringSHA256Encrypt(stringstrIN)
{
//stringstrIN=getstrIN(strIN);
byte[]tmpByte;
SHA256sha256=newSHA256Managed();
tmpByte=puteHash(GetKeyByteArray(strIN));
sha256.Clear();
returnGetStringValue(tmpByte);
}
publicstringSHA512Encrypt(stringstrIN)
{
//stringstrIN=getstrIN(strIN);
byte[]tmpByte;
SHA512sha512=newSHA512Managed();
tmpByte=puteHash(GetKeyByteArray(strIN));
sha512.Clear();
returnGetStringValue(tmpByte);
}
/**////<summary>
///使用DES加密(Addedbyniehl-4-6)
///</summary>
///<paramname="originalValue">待加密的字符串</param>
///<paramname="key">密钥(最大长度8)</param>
///<paramname="IV">初始化向量(最大长度8)</param>
///<returns>加密后的字符串</returns>
publicstringDESEncrypt(stringoriginalValue,stringkey,stringIV)
{
//将key和IV处理成8个字符
key+="12345678";
IV+="12345678";
key=key.Substring(0,8);
IV=IV.Substring(0,8);
SymmetricAlgorithmsa;
ICryptoTransformct;
MemoryStreamms;
CryptoStreamcs;
byte[]byt;
sa=newDESCryptoServiceProvider();
sa.Key=Encoding.UTF8.GetBytes(key);
sa.IV=Encoding.UTF8.GetBytes(IV);
ct=sa.CreateEncryptor();
byt=Encoding.UTF8.GetBytes(originalValue);
ms=newMemoryStream();
cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(byt,0,byt.Length);
cs.FlushFinalBlock();
cs.Close();
returnConvert.ToBase64String(ms.ToArray());
}
publicstringDESEncrypt(stringoriginalValue,stringkey)
{
returnDESEncrypt(originalValue,key,key);
}
/**////<summary>
///使用DES解密(Addedbyniehl-4-6)
///</summary>
///<paramname="encryptedValue">待解密的字符串</param>
///<paramname="key">密钥(最大长度8)</param>
///<paramname="IV">m初始化向量(最大长度8)</param>
///<returns>解密后的字符串</returns>
publicstringDESDecrypt(stringencryptedValue,stringkey,stringIV)
{
//将key和IV处理成8个字符
key+="12345678";
IV+="12345678";
key=key.Substring(0,8);
IV=IV.Substring(0,8);
SymmetricAlgorithmsa;
ICryptoTransformct;
MemoryStreamms;
CryptoStreamcs;
byte[]byt;
sa=newDESCryptoServiceProvider();
sa.Key=Encoding.UTF8.GetBytes(key);
sa.IV=Encoding.UTF8.GetBytes(IV);
ct=sa.CreateDecryptor();
byt=Convert.FromBase64String(encryptedValue);
ms=newMemoryStream();
cs=newCryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(byt,0,byt.Length);
cs.FlushFinalBlock();
cs.Close();
returnEncoding.UTF8.GetString(ms.ToArray());
}
publicstringDESDecrypt(stringencryptedValue,stringkey)
{
returnDESDecrypt(encryptedValue,key,key);
}
privatestringGetStringValue(byte[]Byte)
{
stringtmpString="";
if(this.isReturnNum==false)
{
ASCIIEncodingAsc=newASCIIEncoding();
tmpString=Asc.GetString(Byte);
}
else
{
intiCounter;
for(iCounter=0;iCounter<Byte.Length;iCounter++)
{
tmpString=tmpString+Byte[iCounter].ToString();
}
}
returntmpString;
}
privatebyte[]GetKeyByteArray(stringstrKey)
{
ASCIIEncodingAsc=newASCIIEncoding();
inttmpStrLen=strKey.Length;
byte[]tmpByte=newbyte[tmpStrLen-1];
tmpByte=Asc.GetBytes(strKey);
returntmpByte;
}
}
}