C# 五大加密算法全套实战(AES/DES对称、RSA非对称、MD5/SHA256哈希)

一、加密算法整体分类(必考面试核心)

算法类型 代表算法 特点 可逆性 场景
对称加密 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不推荐,新项目选新一代。

相关推荐
互联网底层民工1 小时前
异步 / 多线程并发(高频八股 · 详解版)
c#
罗超驿1 小时前
6.Java LinkedList深度解析:从链表原理到源码实践
java·开发语言·链表
2501_948106911 小时前
计算机毕业设计之jsp物业管理系统
java·大数据·开发语言·汽车·课程设计
逝水无殇2 小时前
C# 反射详解
开发语言·后端·c#
xlxxy_2 小时前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
北冥you鱼2 小时前
Go语言常用包使用指南:从标准库到第三方利器
开发语言·microsoft·golang
神秘的MT2 小时前
SQL Server 分页查询 ROW_NUMBER () OFFSET...FETCH游标(Cursor) 数据插入
数据库·sql·学习·c#·winform
我才是银古2 小时前
一个人写出的 3D 几何引擎:Ara3D SDK 技术深度剖析
c#·三维几何·ai平台
俺不中嘞2 小时前
python常用函数
开发语言·python