目录
一、加密解密介绍
不可逆加密:MD5、SHA-x系列
对称式加密:Des、3DES、RC2、AES、Base64
非对称加密:Rsa
二、MD5
介绍:
不可逆加密
本质是通过哈希计算,可以对普通的数据信息进行加密,也可以对文件生成文件的摘要。
规则:
不同长度的内容加密后加过都是 32 位
加密不可逆
原文差别很小,结果差别很大
主要用途:
1、用户密码加密
2、验证文件的完整性
3、极速秒传,扫描文件的MD5跟已有的文件MD5比对,吻合表示文件已存在不用再上传;
核心代码:
///<summary>
/// MD5加密 -- 不可逆
/// </summary>
public class MD5Encrypt
{
/// <summary>
/// 静态调用
/// </summary>
public static MD5Encrypt MD5 { get { return new MD5Encrypt(); } }
#region 方法
/// <summary>
/// MD5加密,和动网上的16/32位MD5加密结果相同
/// 使用的UTF8编码
/// </summary>
/// <param name="source">待加密字串</param>
/// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
/// <returns>加密后的字串</returns>
internal string Encrypt(string source, int length = 32)//默认参数
{
if (string.IsNullOrEmpty(source)) return string.Empty;
HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
//转换成字节码
byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
//根据字节码转换成16个Hash码
byte[] hashValue = provider.ComputeHash(bytes);
//字符拼接
StringBuilder sb = new StringBuilder();
switch (length)
{
case 16://16位密文是32位密文的9到24位字符
for (int i = 4; i < 12; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
case 32:
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
default:
for (int i = 0; i < hashValue.Length; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
}
return sb.ToString();
}
/// <summary>
/// 获取文件的MD5摘要
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
internal string AbstractFile(string fileName)
{
using (FileStream file = new FileStream(fileName, FileMode.Open))
{
return AbstractFile(file);
}
}
/// <summary>
/// 根据stream获取文件摘要
/// </summary>
/// <param name="stream">文件流</param>
/// <returns></returns>
internal string AbstractFile(Stream stream)
{
MD5 md5 = new MD5CryptoServiceProvider();
//获取16个Hash码
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();
}
#endregion
}
代码应用:
internal class Program
{
static void Main(string[] args)
{
string a = "111";
string result = MD5Encrypt.MD5.Encrypt(a);
Console.WriteLine(result); //结果显示:698d51a19d8a121ce581499d7b701668
string path_a = @"C:\Users\Rush\Desktop\C#\加密解码各种方法\a.txt";
string path_b = @"C:\Users\Rush\Desktop\C#\加密解码各种方法\b.txt";
string p_a = MD5Encrypt.MD5.AbstractFile(path_a);
Console.WriteLine(p_a); //结果显示:f9c2a9f852c31d2a8bb619033b4246f1
string p_b = MD5Encrypt.MD5.AbstractFile(path_b);
Console.WriteLine(p_b); //结果显示:f9c2a9f852c31d2a8bb619033b4246f1
}
}
三、SHA-x系列
介绍:
SHA-1(安全哈希算法,也称为安全哈希标准)是由美国政府发布的一种加密哈希算法。
可以根据任意长度的字符串生成160位的哈希值。HMACSHA1接受任何大小的密钥,并产生长度为160位的哈希序列。
比MD5安全性更高
主要用途:
数字签名、数字时间戳、数字证书
注:SHA-1 已经被破解,不推荐使用
核心代码:
/// <summary>
/// SHA加密 -- 不可逆
/// </summary>
public class SHAEncrypt
{
/// <summary>
/// 静态方法
/// </summary>
public static SHAEncrypt SHA { get { return new SHAEncrypt(); } }
#region 方法
/// <summary>
/// SHA1加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <returns>加密后的字符串。(40个字符)</returns>
public string SHA1Encrypt(string encryptText)
{
return SHAxEncrypt(new SHA1CryptoServiceProvider(), encryptText, true);
}
/// <summary>
/// SHA1加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <param name="textLength">
/// true -- 40个字符(默认)
/// false -- 28个字符
/// </param>
/// <returns>加密后的字符串。(28个字符)</returns>
public string SHA1Encrypt(string encryptText, bool textLength)
{
return SHAxEncrypt(new SHA1CryptoServiceProvider(), encryptText, textLength);
}
/// <summary>
/// SHA256加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <returns>加密后的字符串。(64个字符)</returns>
public string SHA256Encrypt(string encryptText)
{
return SHAxEncrypt(new SHA256CryptoServiceProvider(), encryptText, true);
}
/// <summary>
/// SHA256加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <param name="textLength">
/// true -- 64个字符(默认)
/// false -- 44个字符
/// </param>
/// <returns>加密后的字符串。(44个字符)</returns>
public string SHA256Encrypt(string encryptText, bool textLength)
{
return SHAxEncrypt(new SHA256CryptoServiceProvider(), encryptText, textLength);
}
/// <summary>
/// SHA384加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <returns>加密后的字符串。(96个字符)</returns>
public string SHA384Encrypt(string encryptText)
{
return SHAxEncrypt(new SHA384CryptoServiceProvider(), encryptText, true);
}
/// <summary>
/// SHA384加密
/// </summary>
/// <param name="encryptText">待加密文本</param>
/// <param name="textLength">
/// true -- 96个字符(默认)
/// false -- 64个字符
/// </param>
/// <returns>加密后的字符串。(64个字符)<