使用C#实现AES加密与解密的示例代码详解

数据的世界01 2024-12-04 10:39:49编程技术
150

AES(Advanced Encryption Standard,高级加密标准)作为一种广泛使用的对称加密算法,提供了高效且安全的数据加密和解密功能。C# 作为 .NET 平台上的主要编程语言,提供了丰富的类库来实现 AES 加密与解密。本文将详细介绍如何使用 C# 实现 AES 加密与解密,并提供示例代码,帮助读者快速掌握这一关键技术。

c#.jpg

1. AES 加密简介

AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,意味着加密和解密使用相同的密钥。AES 支持不同的密钥长度,如 128 位、192 位和 256 位。为了简便起见,本文将使用 128 位密钥(即 16 字节)进行加密。

2. C# 中的 AES 加密与解密

在 C# 中,System.Security.Cryptography 命名空间提供了内置的 AES 加密支持。通过 Aes 类,我们可以轻松实现加密和解密操作。以下是一个完整的示例代码,展示了如何在 C# 中进行 AES 加密和解密。

    class Program
    {
        private static string key = "1234567890123456"; // 16字节密钥,AES-128
        private static string iv = "1234567890123456";  // 16字节IV(初始化向量)
 
        // 加密函数
        public static string Encrypt(string plainText)
        {
            using (Aes aesAlg = Aes.Create()) // 创建AES加密实例
            {
                aesAlg.Key = Encoding.UTF8.GetBytes(key);  // 设置密钥
                aesAlg.IV = Encoding.UTF8.GetBytes(iv);    // 设置初始化向量
 
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); // 创建加密器
 
                using (MemoryStream msEncrypt = new MemoryStream())  // 用于存储加密后的数据
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))  // 创建加密数据流
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))  // 写入加密流
                        {
                            swEncrypt.Write(plainText);  // 写入明文数据
                        }
                    }
                    // 返回加密后的数据,转换为Base64字符串
                    return Convert.ToBase64String(msEncrypt.ToArray());
                }
            }
        }
 
        // 解密函数
        public static string Decrypt(string cipherText)
        {
            using (Aes aesAlg = Aes.Create()) // 创建AES实例
            {
                aesAlg.Key = Encoding.UTF8.GetBytes(key);  // 设置密钥
                aesAlg.IV = Encoding.UTF8.GetBytes(iv);    // 设置初始化向量
 
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);  // 创建解密器
 
                using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))  // 将Base64字符串转换为字节数组并读取
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))  // 创建解密数据流
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))  // 从解密流中读取数据
                        {
                            return srDecrypt.ReadToEnd();  // 返回解密后的明文
                        }
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            string originalText = "Hello, AES Encryption!";  // 原始明文
            Console.WriteLine("Original Text: " + originalText);  // 输出原始文本
 
            string encryptedText = Encrypt(originalText);  // 加密
            Console.WriteLine("Encrypted Text: " + encryptedText);  // 输出加密后的文本
 
            string decryptedText = Decrypt(encryptedText);  // 解密
            Console.WriteLine("Decrypted Text: " + decryptedText);  // 输出解密后的文本
 
            Console.ReadKey();
        }
    }

3. 代码详解

  1. 密钥和初始化向量(IV)

    • 在 AES 加密中,密钥长度和初始化向量(IV)的长度非常重要。这里使用了 16 字节的密钥(128 位),也使用了 16 字节的 IV。这是 AES-128 加密所需的标准设置。

  2. 加密过程

    • 使用 Aes.Create() 创建 AES 实例。

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

    • 使用 CreateEncryptor 创建加密器,接着通过 CryptoStream 和 MemoryStream 实现数据流的加密。

    • 最终将加密后的字节流转换为 Base64 字符串,方便以文本形式存储或传输。

  3. 解密过程

    • 解密过程与加密过程相反。我们使用相同的密钥和 IV,通过 CreateDecryptor 解密数据流,最终恢复原始文本。

4. 示例输出

假设我们加密并解密一段文本 "Hello, AES Encryption!",输出将如下所示:

Original Text: Hello, AES Encryption!
Encrypted Text: P5/fGFh/sUsYOGYOg7wDIA==
Decrypted Text: Hello, AES Encryption!

可以看到,原始文本被成功加密并转换为一个 Base64 编码的字符串,然后又解密回原始的明文。

5. 安全注意事项

在实际应用中,密钥和初始化向量的生成应该更为复杂且具有随机性,以提高加密的安全性。避免使用固定的密钥和 IV,尤其是在生产环境中。

例如,可以使用 RNGCryptoServiceProvider 来生成一个随机的密钥和 IV,而不是手动指定它们。这样可以增强加密的强度,确保每次加密都具有独一无二的安全性。

在线AES加密解密工具https://www.zhanid.com/tool/aes.html

6. 结语

通过本文的介绍,我们详细了解了如何使用 C# 实现 AES 加密与解密。通过示例代码,读者可以清楚地看到如何生成密钥和初始化向量,以及如何进行数据的加密和解密操作。AES 加密算法的高效性和安全性使其成为保护敏感数据的理想选择。无论是开发桌面应用、Web 应用还是移动应用,掌握 AES 加密与解密技术都是非常重要的。希望本文的内容能够帮助大家更好地理解和应用这一技术,提升应用程序的安全性。

c# aes加密 aes解密
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

C#实现美国东部时间与北京时间相互转换的示例代码详解
在C#编程中,处理日期和时间是一项常见的任务。特别是在涉及跨时区的情况下,如将美国东部时间(ET)转换为北京时间(BJT),或者相反,需要对时区偏移量、夏令时等因素进行准确的...
2024-12-20 编程技术
106

C#编程中的命名空间(Namespace)使用方法详解
在C#编程中,命名空间(Namespace)是一个重要的概念,它用于组织代码,避免命名冲突,并提高代码的可读性和可维护性。通过合理使用命名空间,开发者可以更好地组织和管理大型项...
2024-12-18 编程技术
112

C#使用iTextSharp库将图片转换为PDF的步骤及实例代码解析
在现代软件开发中,将图片转换为PDF文档是一种常见需求,特别是在处理电子文档、报告生成和数据存储等场景中。iTextSharp是一个功能强大的开源库,专门用于在.NET环境中创建和...
2024-12-14 编程技术
115

C# 中图片与 Base64 字符串的互转技巧
本文将详细介绍如何在C#中将图片转换为Base64字符串,以及如何将Base64字符串转换回图片。我们将探讨两种方法:一种依赖于System.Drawing命名空间,另一种则不依赖于该命名空...
2024-12-09 编程技术
120

C#代码生成器实现原理深度解析
在现代软件开发中,代码生成器作为一种自动化工具,能够显著提高开发效率,减少重复性工作。C#代码生成器作为其中的一种,通过模板引擎和代码生成规则,自动生成符合特定规范...
2024-11-08 编程技术
134

C#获取计算机硬件信息的示例代码
在现代计算机系统中,了解硬件信息对于系统管理、故障排除以及性能优化等方面具有重要意义。C#作为一种广泛使用的编程语言,提供了丰富的API和工具,使得开发人员能够方便地获...
2024-10-21 编程技术
123