导读:本期聚焦于小伙伴创作的《C# AES加密解密完整代码实现教程:从基础概念到安全实践》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C# AES加密解密完整代码实现教程:从基础概念到安全实践》有用,将其分享出去将是对创作者最好的鼓励。

AES加密解密C#代码实现详解

AES(Advanced Encryption Standard)是一种对称分组加密算法,广泛用于保护敏感数据。在C#中,.NET框架提供了System.Security.Cryptography命名空间,内含AES算法的完整实现。本文将详细介绍如何使用C#编写AES加密和解密代码,包括密钥和初始化向量(IV)的生成、加密模式、填充模式等关键配置。

一、AES加密解密基础概念

AES加密使用固定长度的密钥(128位、192位或256位)对数据进行分组加密(分组大小为128位)。加密时需要一个初始化向量(IV)来增加加密结果的随机性,防止相同的明文产生相同的密文。常用的加密模式有CBC(密码分组链接模式)和ECB(电子密码本模式),推荐使用CBC模式。填充模式用于处理数据长度不是分组大小整数倍的情况,常见的有PKCS7。

二、C#中实现AES加密解密的步骤

在C#中,使用Aes类(或AesManagedAesCryptoServiceProvider)进行加密解密。基本步骤如下:

  1. 创建Aes实例。

  2. 设置密钥(Key)和初始化向量(IV)。

  3. 选择加密模式(Mode)和填充模式(Padding)。

  4. 创建加密器或解密器(ICryptoTransform)。

  5. 对字节流进行加密或解密操作。

  6. 将结果转换为需要的格式(如Base64字符串)。

三、完整的C# AES加密解密示例

以下代码演示了如何使用AES-256-CBC模式进行加密和解密,密钥和IV通过安全随机数生成器创建。所有数据最终以Base64字符串形式输出。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class AesEncryption
{
    // 生成随机密钥(256位,即32字节)
    public static byte[] GenerateRandomKey()
    {
        using (var aes = Aes.Create())
        {
            aes.KeySize = 256;
            aes.GenerateKey();
            return aes.Key;
        }
    }

    // 生成随机初始化向量(128位,即16字节)
    public static byte[] GenerateRandomIV()
    {
        using (var aes = Aes.Create())
        {
            aes.GenerateIV();
            return aes.IV;
        }
    }

    // AES加密:将明文字符串转换为Base64密文
    public static string Encrypt(string plainText, byte[] key, byte[] iv)
    {
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException(nameof(plainText));
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException(nameof(key));
        if (iv == null || iv.Length <= 0)
            throw new ArgumentNullException(nameof(iv));

        byte[] encrypted;

        using (var aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            // 创建加密器
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }

        return Convert.ToBase64String(encrypted);
    }

    // AES解密:将Base64密文还原为明文字符串
    public static string Decrypt(string cipherText, byte[] key, byte[] iv)
    {
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException(nameof(cipherText));
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException(nameof(key));
        if (iv == null || iv.Length <= 0)
            throw new ArgumentNullException(nameof(iv));

        // 将Base64密文转换为字节数组
        byte[] cipherBytes = Convert.FromBase64String(cipherText);

        string plaintext = null;

        using (var aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            // 创建解密器
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            using (var msDecrypt = new MemoryStream(cipherBytes))
            {
                using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (var srDecrypt = new StreamReader(csDecrypt))
                    {
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }
        }

        return plaintext;
    }

    // 测试示例
    static void Main(string[] args)
    {
        try
        {
            // 生成密钥和IV
            byte[] key = GenerateRandomKey();
            byte[] iv = GenerateRandomIV();

            Console.WriteLine("密钥(Base64): " + Convert.ToBase64String(key));
            Console.WriteLine("IV(Base64): " + Convert.ToBase64String(iv));

            string original = "Hello, AES Encryption in C#! 这是一段测试文本。";
            Console.WriteLine("原始文本: " + original);

            // 加密
            string encrypted = Encrypt(original, key, iv);
            Console.WriteLine("加密后(Base64): " + encrypted);

            // 解密
            string decrypted = Decrypt(encrypted, key, iv);
            Console.WriteLine("解密后: " + decrypted);

            Console.WriteLine("加密解密成功:" + (original == decrypted));
        }
        catch (Exception ex)
        {
            Console.WriteLine("错误:" + ex.Message);
        }
    }
}

四、代码要点说明

  • 密钥和IV的生成:使用Aes.GenerateKey()Aes.GenerateIV()方法生成密码学安全的随机字节。生产环境中密钥应安全存储(如环境变量、密钥管理服务),IV可以与密文一起传输(不必保密,但必须唯一)。

  • 加密模式:代码中显式设置为CipherMode.CBC,避免使用默认的CBC或可能不安全的ECB模式。

  • 填充模式PaddingMode.PKCS7是常用且安全的填充方式。

  • 流处理:使用CryptoStream配合MemoryStream处理内存中的字节数据,避免了手动管理缓冲区的复杂性。

  • Base64编码:密文用Base64编码输出,便于在文本协议中传输(如JSON、XML)。

五、注意事项与安全建议

  • 切勿硬编码密钥或IV在源代码中,应使用安全的密钥管理方案。

  • IV必须是随机的且每个加密操作使用不同的IV,否则可能泄露明文信息。

  • 生产环境中建议使用认证加密模式(如GCM)以防止密文被篡改,.NET中可通过AesGcm类实现(需要.NET Core 3.0+或.NET 5+)。

  • 存储密钥时,可使用Windows的数据保护API(DPAPI)或Azure Key Vault等服务。

  • 对于大量数据,考虑使用流式加密而非一次性加载整个内存。

六、结语

通过上述代码,您可以在C#项目中快速集成AES对称加密功能。理解AES的参数配置和安全性要求是正确使用加密的关键。在实际开发中,请根据应用场景选择合适的密钥长度、加密模式和认证机制,确保数据的机密性和完整性。

AES加密 C加密解密 AESCBC模式 对称加密 密钥管理

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。