概述
1,单向加密:SHA1和MD5,只能加密而不能解密,常用语密码的存储。使用方法各有两种。
public static string EncrtptMD5(string pData,string pEncode)
{
MD5CryptoServiceProvider sMD5 = new MD5CryptoServiceProvider();
try
{
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sRes = sMD5.ComputeHash(sData, 0, sData.Length);
return Convert.ToBase64String(sRes, 0, sRes.Length);
}
catch (Exception E)
{
MessageBox.Show(E.Message);
return "";
}
}
public static string EncryptSHA1(string pData, string pEncode)
{
SHA1CryptoServiceProvider sSHA1 = new SHA1CryptoServiceProvider();
try
{
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sRes = sSHA1.ComputeHash(sData, 0, sData.Length);
return Convert.ToBase64String(sRes);
}
catch (Exception E)
{
MessageBox.Show(E.Message);
return "";
}
}
public static string EncryptMD5(string pData)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(pData, "MD5");
}
public static string EncryptSHA1(string pData)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(pData,"SHA1");
}
2,双向加密DES,由于不怎么安全实际用的不是很多
public static string EncryptDES(string pData, string pKey, string pV, string pEncode)
{
if (pKey.Length > 8)
pKey = pKey.Substring(0, 8);
else if (pKey.Length < 8)
pKey = pKey + "abcdefgh".Substring(0,8-pKey.Length);
DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMemStream = new MemoryStream();
CryptoStream sCrptStream = new CryptoStream(sMemStream, sDes.CreateEncryptor(sKey, sV), CryptoStreamMode.Write);
sCrptStream.Write(sData, 0, sData.Length);
sCrptStream.FlushFinalBlock();
return Convert.ToBase64String(sMemStream.ToArray());
}
public static string DecryptDES(string pData, string pKey, string pV, string pEncode)
{
if (pKey.Length > 8)
pKey = pKey.Substring(0, 8);
else if (pKey.Length < 8)
pKey = pKey + "abcdefgh".Substring(0, 8 - pKey.Length);
/* DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Convert.FromBase64String(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMemStream = new MemoryStream();
CryptoStream sCryStream = new CryptoStream(sMemStream, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Write);
sCryStream.Write(sData, 0, sData.Length);
sCryStream.FlushFinalBlock();
return Encoding.UTF8.GetString(sMemStream.ToArray());//Convert.ToBase64String(sMemStream.ToArray());*/
DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
byte[] sData = Convert.FromBase64String(pData);
byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);
MemoryStream sMem = new MemoryStream(sData);
CryptoStream sCrypt = new CryptoStream(sMem, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Read);
/*byte[] sRes = new byte[sData.Length];
sCrypt.Read(sRes, 0, sData.Length);
return Encoding.GetEncoding(pEncode).GetString(sRes);不怎么好,因为字节数组大小不好确定*/
StreamReader sReader = new StreamReader(sCrypt);//比较好,要注意,Reader流只能与Read模式配合
return sReader.ReadToEnd();
}
3,关于加密算法有两点需要说明
(a)最好不要用Encoding类把加密的数据转化为字符串,因为它会验证和转换Unicode不允许使用的无效值,这样的话就可能使得将字符串转换回字节数组时得到不同的结果。用Convert.ToBase64String是个不错的选择,所以上面的代码需要一些微小的改动。
(b)DES的解密算法中既可以为CryptoStream指定写模式也可为它指定读模式。处于写模式时MemStream的初始化不需要数据,通过Write方法将数据写入Memstream中,最后将Memstream流转换为数组完成任务;处于读模式时Memstream的初始化需要数据,通过Read方法将数据从Memstream中读入指定的缓冲区中完成任务。
最后
以上就是妩媚黑裤为你收集整理的几个加密算法的全部内容,希望文章能够帮你解决几个加密算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复