C#常见加密方式
C#常见加密方式
一、MD5
MD5消息摘要算法:一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),
用于确保信息传输完整一致.
简单的说就是单向的加密,即是说无法根据密文推导出明文
MD5主要用途:
1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名。
2、用于验证文件的有效性(是否有丢失或损坏的数据),
3、对用户密码的加密,
4、在哈希函数中计算散列值
通过使用MD5加密算法,我们输入一个任意长度的字节串,都会生成一个128位的整数
public static void Md5(string plaintext)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] palindata = Encoding.Default.GetBytes(plaintext);//将要加密的字符串转换为字节数组
byte[] encryptdata = md5.ComputeHash(palindata);//将字符串加密后也转换为字符数组
var a = Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串
Console.Write(a);
}
二、RSA
在谈RSA加密算法之前,我们需要先了解下两个专业名词,对称加密和非对称加密。
对称加密即:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密
非对称加密即:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,
使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),
相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,
顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。
根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。
非对称加密的代表算法是RSA算法。
//加密
private static string RSAEncryption(string express)
{
CspParameters param = new CspParameters();
param.KeyContainerName = "oa_erp_dowork";//密匙容器的名称,保持加密解密一致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] plaindata = Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组
byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
}
}
//解密
private static string RSADecrypt(string ciphertext)
{
CspParameters param = new CspParameters();
param.KeyContainerName = "oa_erp_dowork";
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] encryptdata = Convert.FromBase64String(ciphertext);
byte[] decryptdata = rsa.Decrypt(encryptdata, false);
return Encoding.Default.GetString(decryptdata);
}
}
三、DES
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,
使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES加密解密的过程主要有四个参数参与其中:明文、密钥、向量、加密结果。
他们之间的关系很好理解,加密过程是这样的,加密结果=明文+密钥+向量,反之也是一样的。
值得注意的是密钥和向量字符串长度必须为8.
//加密
private static string DESEncrypt(string e)
{
byte[] buffer;
DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();
DesCSP.Key = ASCIIEncoding.ASCII.GetBytes("12345678");// 密匙字符串长度必须是8
DesCSP.IV = ASCIIEncoding.ASCII.GetBytes("12345678");// 初始化向量
MemoryStream ms = new MemoryStream();//先创建 一个内存流
CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(), CryptoStreamMode.Write);//将内存流连接到加密转换流
StreamWriter sw = new StreamWriter(cryStream);
sw.WriteLine(e);//将要加密的字符串写入加密转换流
sw.Close();
cryStream.Close();
buffer = ms.ToArray();//将加密后的流转换为字节数组
return Convert.ToBase64String(buffer);//将加密后的字节数组转换为字符串
}
//解密
private static string DESDecrypt(string e)
{
string a = null;
try
{
byte[] buffer = Convert.FromBase64String(e); ;
DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();
DesCSP.Key = ASCIIEncoding.ASCII.GetBytes("12345678");// 密匙
DesCSP.IV = ASCIIEncoding.ASCII.GetBytes("12345678");// 初始化向量
MemoryStream ms = new MemoryStream(buffer);//将加密后的字节数据加入内存流中
CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateDecryptor(), CryptoStreamMode.Read);//内存流连接到解密流中
StreamReader sr = new StreamReader(cryStream);
a = sr.ReadToEnd();//将解密流读取为字符串
sr.Close();
cryStream.Close();
ms.Close();
}
catch (Exception ex)
{
var ea = ex.Message;
}
return a;
}
四、AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,
是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,加密速度快,内存消耗少,安全性较DES更优。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,
并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,
对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。
/// <summary>
///
/// </summary>
/// <param name="str"></param>
/// <param name="key">16个字节128位,支持128,192,256</param>
/// <returns></returns>
public static string AesEncrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray);
}
public static string AesDecrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}