一、MD5不可逆加密
源码如下:
/// <summary>
/// MD5不可逆加密
/// 1 防止被篡改
/// 2 防止明文存储
/// 3 防止抵赖,数字签名
/// </summary>
/// <param name="data">要加密的文本</param>
/// <param name="encryptEnum">加密成功后密文的长度</param>
/// <returns>加密之后的文本</returns>
public static string MD5Encrypt(string data, EncryptEnum encryptEnum = EncryptEnum.Default)
{
if (string.IsNullOrEmpty(data)) return null;
//创建MD5新实例
MD5 md5 = MD5.Create();
//选择UTF8编码格式=>把需要加密的文本转成二进制
byte[] bytes = Encoding.UTF8.GetBytes(data);
//把二进制数据转成哈希码
byte[] hashValue = md5.ComputeHash(bytes);
string result = string.Empty;
int max = 0, min = 0;
switch (encryptEnum)
{
case EncryptEnum.Default://c#系统默认加密长度就是32位
case EncryptEnum.ThirtyTwo://32位加密长度
max = 16;
//max = hashValue.Length;
break;
case EncryptEnum.Sixteen://16位密文是32位密文的9到24位字符
max = 12;
min = 4;
break;
}
for (int i = min; i < max; i++)
{
result += hashValue[i].ToString("x2");
}
return result;
}
我在这里封装了一个可供用户选择加密长度的枚举,用来计算加密之后密文文本长度使用的,当然,这是一个可控参数,用户不输入,则默认位c#系统默认MD5加密长度32位
public enum EncryptEnum
{
/// <summary>
/// 系统默认加密
/// </summary>
Default = 0,
/// <summary>
/// 16位加密
/// </summary>
Sixteen = 16,
/// <summary>
/// 三十二位加密
/// </summary>
ThirtyTwo = 32
}
二、DES可逆、对称加密
DES加密必须要指定他的公开的加密Key和IV,我在代码上方定义了一个通过字符串转成的Key和IV,这个字符串大家可以随便填写。
源码如下:
/// <summary>
/// DES AES Blowfish
/// 对称加密算法的优点是速度快,
/// 缺点是密钥管理不方便,要求共享密钥。
/// 可逆对称加密 密钥长度8
/// </summary>
//二进制 key, iv
private static byte[] byteKey = Encoding.ASCII.GetBytes("12345678");
private static byte[] byteIV = Encoding.ASCII.GetBytes("87654321");
/// <summary>
/// DES可逆 对称加密
/// </summary>
/// <param name="data">要加密的文本</param>
/// <returns>64进制字符串</returns>
public static string DESEncrypt(string data)
{
//DES加密实例化
DESCryptoServiceProvider desp = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())//创建内存流
{
//把数据流 => 加密流
//CreateEncryptor方法是DES官方加密算法
CryptoStream cs = new CryptoStream(ms, desp.CreateEncryptor(byteKey, byteIV), CryptoStreamMode.Write);
//实例化写入流
StreamWriter sw = new StreamWriter(cs);
sw.Write(data);//向流中写入需要加密的数据
sw.Flush();//关闭写入器
cs.FlushFinalBlock(); //关闭转换流
ms.Flush();//关闭内存流
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
}
/// <summary>
/// DES 可逆 对称解密
/// </summary>
/// <param name="data">需要解密的64进制字符串</param>
/// <returns>解析后的字符串</returns>
public static string DESDecrypt(string data)
{
//DES加密实例化
using (DESCryptoServiceProvider desp = new DESCryptoServiceProvider())
{
//把64进制字符串 => 二进制流
byte[] buffer = Convert.FromBase64String(data);
using (MemoryStream ms = new MemoryStream())
{
//把加密流 => 数据流
//CreateDecryptor方法是DES官方解密算法
CryptoStream cs = new CryptoStream(ms, desp.CreateDecryptor(byteKey, byteIV), CryptoStreamMode.Write);
cs.Write(buffer, 0, buffer.Length);//向流中写入要解析的数据
cs.FlushFinalBlock();//关闭转换流
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
三、RSA可逆、非对称加密
RSA加密,必须要使用xml信息的公钥和私钥才能对其进行加密解密操作,所以也在代码上方封住了一个获取公钥私钥的方法,大家可以参考以下代码。
源码如下
/**
* RSA ECC
* 可逆非对称加密
* 非对称加密算法的优点是密钥管理很方便,缺点是速度慢。
* */
/// <summary>
/// 获取RSA加密解密的公钥和私钥
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> GetPublicAndPrivateKey()
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string publicKey = rsa.ToXmlString(false);//包含RSA公钥信息的字符串
string privateKey = rsa.ToXmlString(true);//包含RSA公钥和私钥信息的字符串
return new Dictionary<string, string>
{
{ publicKey, privateKey }
};
}
/// <summary>
/// RSA 可逆 非对称加密
/// </summary>
/// <param name="data">要加密的文本</param>
/// <param name="publicKey">必须是包含xml信息的加密使用的公钥</param>
/// <returns>64进制加密之后的字符串文本</returns>
public static string RSAEncrypt(string data, string publicKey)
{
//实例化RSA加密流
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);//解析xml公钥信息
UnicodeEncoding ue = new UnicodeEncoding();//utf-16编码格式
byte[] bytes = ue.GetBytes(data);//把文本 => 二进制
//对文本二进制进行加密,false 不适用默认填充文本
byte[] resultBytes = rsa.Encrypt(bytes, false);
return Convert.ToBase64String(resultBytes);
}
/// <summary>
/// RSA 可逆 非对称解密
/// </summary>
/// <param name="data">要解密64进制的文本</param>
/// <param name="privateKey">必须是包含xml信息的解密使用的私钥</param>
/// <returns>解析成功的文本</returns>
public static string RSADecrypt(string data, string privateKey)
{
//把64进制字符串转成二进制流
byte[] bytes = Convert.FromBase64String(data);
//实例化RSA加密流
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);//解析xml私钥信息
byte[] resultBytes = rsa.Decrypt(bytes, false);
UnicodeEncoding ue = new UnicodeEncoding();//utf-16编码格式
return ue.GetString(resultBytes);
}
四、MD5、DES、RSA,加密\解密调用
简单示例:如图,我定义了一个接口,让他在控制台打印加密解密的数据
如上图所示:跟我们预料的结果一样,加密解密非常成功。
今天的MD5、DES、RSA加密解功能到这里就分享完毕了,大家有什么更加好用的加密解密方法欢迎来评论区讨论!!!