一、加密算法整体分类(必考面试核心)
| 算法类型 | 代表算法 | 特点 | 可逆性 | 场景 |
|---|---|---|---|---|
| 对称加密 | AES、DES | 加密解密同一密钥、速度快、适合大文件 | ||
| 非对称加密 | RSA | 公钥加密、私钥解密、安全性高、速度慢 | 可逆 | 密码校验、签名、密钥分发 |
| 哈希摘要 | MD5、SHA256 | 定长输出、雪崩效应、无密钥 | 不可逆 | 密码存储、文件完整性校验 |
二、对称加密算法
1. AES 高级加密标准(主流、推荐)
原理简述
AES 是分组对称加密算法 ,采用 128/192/256 位密钥;需要 Key密钥 + IV初始向量。
IV 作用:相同明文+相同密钥,不同IV生成不同密文,防止加密结果固定被破解。
AES 完整工具类
cs
using System;
using System.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// AES 对称加密(可逆、推荐商用)
/// </summary>
public class AESHelper
{
// 从配置文件读取密钥和向量
private static readonly string keyString = ConfigurationManager.AppSettings["AESKEY"];
private static readonly string ivString = ConfigurationManager.AppSettings["AESIV"];
private static readonly byte[] key = Encoding.UTF8.GetBytes(keyString);
private static readonly byte[] iv = Encoding.UTF8.GetBytes(ivString);
/// <summary>
/// AES 加密
/// </summary>
public static string Encrypt(string data)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
// 创建加密转换器
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(data);
}
}
// 转Base64字符串输出
return Convert.ToBase64String(ms.ToArray());
}
}
}
/// <summary>
/// AES 解密
/// </summary>
public static string Decrypt(string data)
{
byte[] buffer = Convert.FromBase64String(data);
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream ms = new MemoryStream(buffer))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
}
}
2. DES 数据加密标准(老旧、不推荐)
原理简述
DES 采用 64位密钥(有效56位),安全性低、现已淘汰,仅用于老旧系统兼容。
DES 完整工具类
cs
using System;
using System.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// DES 对称加密(老旧算法、安全性弱)
/// </summary>
public class DESHelper
{
private static readonly string keyString = ConfigurationManager.AppSettings["DESKEY"];
private static readonly byte[] Key = Encoding.UTF8.GetBytes(keyString);
private static readonly byte[] IV = Encoding.UTF8.GetBytes(keyString);
/// <summary>
/// DES 加密
/// </summary>
public static string Encrypt(string data)
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
cs.Write(dataBytes, 0, dataBytes.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
/// <summary>
/// DES 解密
/// </summary>
public static string Decrypt(string data)
{
byte[] buffer = Convert.FromBase64String(data);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(Key, IV), CryptoStreamMode.Write);
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
三、非对称加密 RSA
原理简述
-
公钥(Public) :公开分发,用于 加密
-
私钥(Private) :私密保存,用于解密
-
不可逆推导、安全性极高、适合核心机密数据
RSA 完整工具类(密钥自动生成+加密解密)
cs
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// RSA 非对称加密
/// </summary>
public class RSAHelper
{
// 公钥、私钥
public static string PublicKey { get; set; }
public static string PrivateKey { get; set; }
/// <summary>
/// 自动生成 RSA 公钥私钥对
/// </summary>
public static void GetPairKey()
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.PersistKeyInCsp = false;
PublicKey = rsa.ToXmlString(false); // 公钥
PrivateKey = rsa.ToXmlString(true); // 私钥
Console.WriteLine("公钥:" + PublicKey);
Console.WriteLine("私钥:" + PrivateKey);
}
}
/// <summary>
/// 公钥加密
/// </summary>
public static string Encrypt(string data)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.PersistKeyInCsp = false;
rsa.FromXmlString(PublicKey);
byte[] originBytes = Encoding.UTF8.GetBytes(data);
byte[] encryptBytes = rsa.Encrypt(originBytes, false);
return Convert.ToBase64String(encryptBytes);
}
}
/// <summary>
/// 私钥解密
/// </summary>
public static string Decrypt(string data)
{
byte[] encryptBytes = Convert.FromBase64String(data);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.PersistKeyInCsp = false;
rsa.FromXmlString(PrivateKey);
byte[] originBytes = rsa.Decrypt(encryptBytes, false);
return Encoding.UTF8.GetString(originBytes);
}
}
}
四、不可逆哈希摘要算法
1. MD5 算法
128位定长摘要、不可逆、不安全(存在碰撞),仅用于老旧项目密码存储、文件校验。
cs
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// MD5 哈希摘要(不可逆)
/// </summary>
public class MD5Helper
{
public static string Encrypt(string data)
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.ASCII.GetBytes(data);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
foreach (byte b in hashBytes)
{
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
}
}
2. SHA256 算法(推荐)
SHA256 属于 SHA2 系列,256位定长、安全性远高于 MD5,现代项目优先使用。
cs
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// SHA256 哈希摘要(不可逆、高安全)
/// </summary>
public static class SHAHelper
{
public static string Encrypt(string data)
{
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
{
byte[] hashBytes = sha256.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
foreach (byte b in hashBytes)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
}
}
五、WinForm 界面调用代码
cs
using System;
using System.Windows.Forms;
namespace _02加密
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 程序启动生成RSA密钥对
RSAHelper.GetPairKey();
}
// 加密
private void button1_Click(object sender, EventArgs e)
{
// 按需打开对应算法
//textBox1.Text = AESHelper.Encrypt(textBox2.Text);
//textBox1.Text = DESHelper.Encrypt(textBox2.Text);
//textBox1.Text = RSAHelper.Encrypt(textBox2.Text);
}
// 解密 / 摘要计算
private void button2_Click(object sender, EventArgs e)
{
// 对称、非对称解密
//textBox2.Text = AESHelper.Decrypt(textBox1.Text);
//textBox2.Text = DESHelper.Decrypt(textBox1.Text);
//textBox2.Text = RSAHelper.Decrypt(textBox1.Text);
// 哈希摘要(不可逆,只有加密没有解密)
//textBox2.Text = MD5Helper.Encrypt(textBox1.Text);
textBox2.Text = SHAHelper.Encrypt(textBox1.Text);
}
}
}
六、App.config 配置(必须配置)
cs
<configuration>
<appSettings>
<!-- AES 密钥、向量(16位、24位、32位) -->
<add key="AESKEY" value="1234567890123456"/>
<add key="AESIV" value="1234567890123456"/>
<!-- DES 密钥(8位) -->
<add key="DESKEY" value="12345678"/>
</appSettings>
</configuration>
七、面试高频总结
1. 对称加密(AES/DES)
-
加密解密 同一密钥
-
速度快、适合大量数据
-
AES 安全、DES 老旧淘汰
2. 非对称加密(RSA)
-
公钥加密、私钥解密
-
安全极高、速度慢、适合少量关键数据
3. 哈希算法(MD5/SHA)
-
完全不可逆,只能加密、不能解密
-
用于:密码存储、文件完整性校验
-
SHA256 安全性 > MD5
八、终极背诵口诀
对称AES速度快,同钥加解最自在;
RSA非对称分开,公钥加密私钥开;
MD5SHA不可逆,摘要校验防篡改;
老旧DES不推荐,新项目选新一代。