MD5加密:(不可逆加密)
加解方法封装:
public class Encrypt
{
/// <summary>
/// md5加密后返回密文
/// </summary>
/// <param name="source">要加密的明文</param>
/// <returns></returns>
public static string MD5Encrypt(string source)
{
try
{
MD5 md5 = MD5.Create();
byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(source));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获取文件的md5摘要
/// </summary>
/// <param name="fileName">文件名称</param>
/// <returns>文件摘要</returns>
public static string AbstractFile(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
}
}
实例:
Console.WriteLine(Encrypt.MD5Encrypt("123456"));
Console.WriteLine(Encrypt.AbstractFile(@"C:\Users\Administrator\Desktop\test\jquery.js"));
结果:
md5加密特点:
1.相同原文加密后的结果是一样的
2.不同长度的内容加密后长度是一样的
3.加密不可逆,不能通过密文解密出原文
4.原文差别很小,但加密后的结果差别很大
扫描二维码关注公众号,回复:
12574583 查看本文章
5.文件也可以经过加密产生摘要
md5加密应用:
1.系统登录的密码,经md5加密后将密文存在数据库中,用户登录时对用户输入的密码用md5加密后和数据库比较。(密码保存,防止看到明文)
2.源代码管理器,比如svn,文件有改动时,文件就会出现被改动的标记。(防篡改)
3.极速秒传,扫描文件的md5,跟已有的文件md5比对,吻合表示文件已存在则不再上传。
4.数字签名,把一些内容摘要一下,由权威的第三方去保障,将来这个文件就是由你做的,不能抵赖。
DES加密:(对称可逆加密)
app.config添加一个配置型,用于存储加密的key
<appSettings>
<add key="DesKey" value="hello666"/>
</appSettings>
加解密方法封装:
public class Encrypt
{
public static string DesKey = ConfigurationManager.AppSettings["DesKey"];
private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(DesKey.Substring(0, 8));
private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(DesKey.Insert(0, "w").Substring(0, 8));
/// <summary>
/// DES加密
/// </summary>
/// <param name="text">需要加密的值</param>
/// <returns>加密后的结果</returns>
public static string DesEncrypt(string text)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(crypStream);
sWriter.Write(text);
sWriter.Flush();
crypStream.FlushFinalBlock();
memStream.Flush();
return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="encryptText">需要解密的值</param>
/// <returns>解密后的结果</returns>
public static string DesDecrypt(string encryptText)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
byte[] buffer = Convert.FromBase64String(encryptText);
using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
crypStream.Write(buffer, 0, buffer.Length);
crypStream.FlushFinalBlock();
memStream.Flush();
return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
}
}
}
实例:
string strDes = Encrypt.DesEncrypt("张三");
Console.WriteLine(strDes);
Console.WriteLine(Encrypt.DesDecrypt(strDes));
结果:
DES加密特点:
1.加密后能解密回原文,加密key和解密key是同一个。
2.加密解密的速度快,问题是密钥的安全性。
RSA加密:(不对称可逆加密)
加解密方法封装:
public class Encrypt
{
/// <summary>
/// RSA随机生成一对密钥
/// </summary>
/// <returns>一对密钥值</returns>
public static KeyValuePair<string, string> GetKeyPair()
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
string publicKey = RSA.ToXmlString(false);
string privateKey = RSA.ToXmlString(true);
return new KeyValuePair<string, string>(publicKey, privateKey);
}
/// <summary>
/// RSA加密(内容+加密key)
/// </summary>
/// <param name="content">内容</param>
/// <param name="encryptKey">加密key</param>
/// <returns>加密后的信息</returns>
public static string RSAEncrypt(string content, string encryptKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(encryptKey);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(content);
byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
return Convert.ToBase64String(resultBytes);
}
/// <summary>
/// RSA解密(内容+解密key)
/// </summary>
/// <param name="content">内容</param>
/// <param name="descryptKey">解密key</param>
/// <returns></returns>
public static string RSADecrypt(string content, string descryptKey)
{
byte[] dataToDecrypt = Convert.FromBase64String(content);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(descryptKey);
byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
return ByteConverter.GetString(resultBytes);
}
}
实例:
KeyValuePair<string, string> encryptDescypt = Encrypt.GetKeyPair();
string rsaEn = Encrypt.RSAEncrypt("123456",encryptDescypt.Key);
string rsaDe = Encrypt.RSADecrypt(rsaEn, encryptDescypt.Value);
Console.WriteLine(rsaEn);
Console.WriteLine(rsaDe);
结果:
RSA加密特点:
1.加密后能解密回原文,加密key和解密key不是同一个。
2.加密解密速度不快,但安全性好。
3.公开加密key,保证数据的安全传递。
4.公开解密key,保证数据的不可抵赖。