写点什么

.NET 常见的 4 种加密算法

作者:青柚1943
  • 2023-09-18
    湖南
  • 本文字数:4088 字

    阅读完需:约 13 分钟

在本文中,我们将介绍 .NET 的加密和解密功能。在 Web 应用程序中,用户的密码通常会使用 MD5 值作为密码数据存储。在其他情况下,也可能会使用加密和解密功能。

常见的加密算法分为对称加密和非对称加密。对称加密是指加密密钥和解密密钥相同,而非对称加密是加密密钥和解密密钥不同。

MD5 本质上不是加密算法,而是一种信息摘要算法。它将任意长度的数据转换为固定长度的数据。MD5 尽量保证了每个字符串最后计算出来的值都不一样,所以在密码保存中常用 MD5 做为保密值。

1. 信息摘要算法

这种算法严格意义上并不是加密算法,因为它是不可逆的。也就是说,一旦使用这种算法加密数据,就无法解密还原出原始数据。正是因为这种特性,它常常被用来保存密码。这样,即使有人获得了数据库和代码,也无法简单地推断出用户的密码。

1.1 MD5 算法

MD5 信息摘要算法是一种被广泛使用的密码散列函数,它将任意长度的数据转换为固定长度的摘要,也称为哈希值。MD5 的摘要长度为 128 位(16 字节),用于确保信息传输的完整性。

具体实现:


using System;using System.Security.Cryptography;using System.Text;
public class MD5Helper{
public string Encrypt(string input) {
using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.ASCII.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return sb.ToString(); }
}
}
复制代码

2、常见对称加密算法

对称加密算法是指加密和解密使用相同的密钥进行运算。解密和加密是互逆的运算,因此对称加密算法的安全性取决于密钥的长度,密钥越长越安全。不过,密钥的长度也不宜过长,否则会影响加密和解密的速度。

接下来,我们将介绍常见的对称加密算法,以及 C# 实现方法。

2.1 DES 和 DESede 算法

DES 和 DESede 算法统称 DES 系列算法。DES 全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。DESede 则是针对同一块数据做三次 DES 加密。

实现方式:


#region ========加密======== /// <summary> /// 加密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static string Encrypt(string Text) { return Encrypt(Text,"MATICSOFT"); } /// <summary> /// 加密数据 /// </summary> /// <param name="Text"></param> /// <param name="sKey"></param> /// <returns></returns> public static string Encrypt(string Text,string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray; inputByteArray=Encoding.Default.GetBytes(Text); des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); System.IO.MemoryStream ms=new System.IO.MemoryStream(); CryptoStream cs=new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write); cs.Write(inputByteArray,0,inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret=new StringBuilder(); foreach( byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}",b); } return ret.ToString(); }
#endregion #region ========解密======== /// <summary> /// 解密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static string Decrypt(string Text) { return Decrypt(Text,"MATICSOFT"); } /// <summary> /// 解密数据 /// </summary> /// <param name="Text"></param> /// <param name="sKey"></param> /// <returns></returns> public static string Decrypt(string Text,string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); int len; len=Text.Length/2; byte[] inputByteArray = new byte[len]; int x,i; for(x=0;x<len;x++) { i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); inputByteArray[x]=(byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); System.IO.MemoryStream ms=new System.IO.MemoryStream(); CryptoStream cs=new CryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write); cs.Write(inputByteArray,0,inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray()); } #endregion
复制代码


2.2 AES 加密算法

AES 算法是高级数据加密标准算法,旨在解决 DES 算法中的漏洞。AES 算法的核心是 Rijndael 算法。

具体的加解密实现:


using System;using System.IO;using System.Security.Cryptography;using System.Text;
public class AESHelper {
public string Encrypt(string plainText, string key) {
byte[] iv = new byte[16]; byte[] array;
using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { using (StreamWriter streamWriter = new StreamWriter(cryptoStream)) { streamWriter.Write(plainText); }
array = memoryStream.ToArray(); } } }
return Convert.ToBase64String(array); }
public string Decrypt(string cipherText, string key) {
byte[] iv = new byte[16]; byte[] buffer = Convert.FromBase64String(cipherText);
using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream(buffer)) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { using (StreamReader streamReader = new StreamReader(cryptoStream)) { return streamReader.ReadToEnd(); } } } }
}
}
复制代码

3.常见非对称加密算法

非对称加密算法是指加密密钥和解密密钥不同。非对称加密算法的密钥通常成对出现,分为公钥和私钥。公钥可以公开发布,而私钥需要保密。由于非对称加密算法的特性,无法通过公钥推导出私钥,反之亦然。

通常,非对称加密算法是用公钥进行加密,用私钥进行解密。

3.1 RSA 算法

RSA 算法是标准的非对称加密算法,由 Rivest、Shamir 和 Adleman 三人发明。RSA 算法是一种使用不同加密密钥和解密密钥的密码体制,其安全性取决于密钥的长度。1024 位的 RSA 密钥几乎不可能被破解。

具体实现:


using System;using System.Security.Cryptography;using System.Text;
public class RSAHelper {
private string publicKey; private string privateKey;
public RSAHelper(string publicKey, string privateKey) { this.publicKey = publicKey; this.privateKey = privateKey; }
public string Encrypt(string plainText) {
var publicKeyBytes = Convert.FromBase64String(publicKey);
using(var rsa = new RSACryptoServiceProvider(2048)) { rsa.ImportSubjectPublicKeyInfo(publicKeyBytes, out _); var plainTextBytes = Encoding.UTF8.GetBytes(plainText); var cipherTextBytes = rsa.Encrypt(plainTextBytes, RSAEncryptionPadding.Pkcs1); return Convert.ToBase64String(cipherTextBytes); }
}
public string Decrypt(string cipherText) { var privateKeyBytes = Convert.FromBase64String(privateKey); var rsa = new RSACryptoServiceProvider(2048); rsa.ImportPkcs8PrivateKey(privateKeyBytes, out _);
var cipherBytes = Convert.FromBase64String(cipherText); var plainTextBytes = rsa.Decrypt(cipherBytes, RSAEncryptionPadding.Pkcs1); return Encoding.UTF8.GetString(plainTextBytes);
}
}
复制代码

另外,因为 RSA 的特殊性,需要预先设置好公钥和私钥。C# 支持多种方式导入密钥,这里就不做过多介绍了。

4 总结

本文简单介绍了四种常用的加密算法的实现。其中,MD5 是最常用的加密算法,因为它被大多数系统用来保存密码。以上案例仅供参考,具体根据.NET 的版本进行调整。

用户头像

青柚1943

关注

生命不息,代码不止。 2020-08-04 加入

老街坊,小弄堂,是属于那年代白墙黑瓦的淡淡的忧伤。

评论

发布
暂无评论
.NET常见的4种加密算法_青柚1943_InfoQ写作社区