C#加解密之AES算法的实现

下面就为大家详细讲解“C#加解密之AES算法的实现”的完整攻略。

什么是AES算法

AES(Advanced Encryption Standard),高级加密标准,是一种对称加密算法,是由美国国家标准与技术研究院(NIST)于2001年10月2日发布的一种加密标准,已被广泛应用于各种计算机系统的安全保护之中。

AES算法实现

在C#中,可以通过以下步骤实现AES算法的加密和解密:

  1. 导入命名空间 using System.Security.Cryptography;
  2. 创建一个 AES 算法实例 Aes aes = Aes.Create();
  3. 设置AES加密的密钥和IV值 aes.Keyaes.IV
  4. 创建一个加密流 ICryptoTransform encryptor = aes.CreateEncryptor();
  5. 创建一个解密流 ICryptoTransform decryptor = aes.CreateDecryptor();
  6. 通过加密和解密流加密和解密数据

以下是一个 AES 加密和解密的示例代码:

using System;
using System.Security.Cryptography;

namespace AESexample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 待加密的数据
            string plainText = "Hello, world!";

            // 创建一个 AES 算法实例
            Aes aes = Aes.Create();

            // 设置加密的密钥和向量
            aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
            aes.IV = Encoding.UTF8.GetBytes("1234567890123456");

            // 创建一个加密流和一个解密流
            ICryptoTransform encryptor = aes.CreateEncryptor();
            ICryptoTransform decryptor = aes.CreateDecryptor();

            // 加密数据
            byte[] encrypted = EncryptStringToBytes_Aes(plainText, encryptor);

            // 解密数据
            string decrypted = DecryptStringFromBytes_Aes(encrypted, decryptor);

            // 输出结果
            Console.WriteLine("Plain text: " + plainText);
            Console.WriteLine("Encrypted text: " + Convert.ToBase64String(encrypted));
            Console.WriteLine("Decrypted text: " + decrypted);    
        }

        static byte[] EncryptStringToBytes_Aes(string plainText, ICryptoTransform encryptor)
        {
            byte[] encrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                // 创建一个 crypto stream 对象
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    // 创建一个 writer 对象
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        // 将数据写入流
                        swEncrypt.Write(plainText);
                    }
                    // 获取加密后的数据
                    encrypted = msEncrypt.ToArray();
                }
            }

            return encrypted;
        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, ICryptoTransform decryptor)
        {
            string decrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                // 创建一个 crypto stream对象
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    // 创建一个 reader 对象
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        // 从流中读取加密数据
                        decrypted = srDecrypt.ReadToEnd();
                    }
                }
            }

            return decrypted;
        }
    }
}

示例说明

下面我们通过两个示例来说明如何使用 AES 算法进行加密和解密。

示例1:AES加密和解密字符串

using System;
using System.Security.Cryptography;

namespace AESexample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 待加密的数据
            string plainText = "Hello, world!";

            // 创建一个 AES 算法实例
            Aes aes = Aes.Create();

            // 设置加密的密钥和向量
            aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
            aes.IV = Encoding.UTF8.GetBytes("1234567890123456");

            // 创建一个加密流和一个解密流
            ICryptoTransform encryptor = aes.CreateEncryptor();
            ICryptoTransform decryptor = aes.CreateDecryptor();

            // 加密数据
            byte[] encrypted = EncryptStringToBytes_Aes(plainText, encryptor);

            // 解密数据
            string decrypted = DecryptStringFromBytes_Aes(encrypted, decryptor);

            // 输出结果
            Console.WriteLine("Plain text: " + plainText);
            Console.WriteLine("Encrypted text: " + Convert.ToBase64String(encrypted));
            Console.WriteLine("Decrypted text: " + decrypted);    
        }

        static byte[] EncryptStringToBytes_Aes(string plainText, ICryptoTransform encryptor)
        {
            byte[] encrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                // 创建一个 crypto stream 对象
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    // 创建一个 writer 对象
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        // 将数据写入流
                        swEncrypt.Write(plainText);
                    }
                    // 获取加密后的数据
                    encrypted = msEncrypt.ToArray();
                }
            }

            return encrypted;
        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, ICryptoTransform decryptor)
        {
            string decrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                // 创建一个 crypto stream对象
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    // 创建一个 reader 对象
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        // 从流中读取加密数据
                        decrypted = srDecrypt.ReadToEnd();
                    }
                }
            }

            return decrypted;
        }
    }
}

运行结果:

Plain text: Hello, world!
Encrypted text: RB1hmXAsWFS2hx7i/CU7jw==
Decrypted text: Hello, world!

示例2:从文件中读取数据进行AES加密和解密

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

namespace AESexample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取文件中的数据
            string plainText = File.ReadAllText(@"./text.txt");

            // 创建一个 AES 算法实例
            Aes aes = Aes.Create();

            // 设置加密的密钥和向量
            aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
            aes.IV = Encoding.UTF8.GetBytes("1234567890123456");

            // 创建一个加密流和一个解密流
            ICryptoTransform encryptor = aes.CreateEncryptor();
            ICryptoTransform decryptor = aes.CreateDecryptor();

            // 加密数据
            byte[] encrypted = EncryptStringToBytes_Aes(plainText, encryptor);

            // 解密数据
            string decrypted = DecryptStringFromBytes_Aes(encrypted, decryptor);

            // 输出结果
            Console.WriteLine("Plain text: " + plainText);
            Console.WriteLine("Encrypted text: " + Convert.ToBase64String(encrypted));
            Console.WriteLine("Decrypted text: " + decrypted);    
        }

        static byte[] EncryptStringToBytes_Aes(string plainText, ICryptoTransform encryptor)
        {
            byte[] encrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                // 创建一个 crypto stream 对象
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    // 创建一个 writer 对象
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        // 将数据写入流
                        swEncrypt.Write(plainText);
                    }
                    // 获取加密后的数据
                    encrypted = msEncrypt.ToArray();
                }
            }

            return encrypted;
        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, ICryptoTransform decryptor)
        {
            string decrypted;

            // 创建一个 memory stream 对象
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                // 创建一个 crypto stream对象
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    // 创建一个 reader 对象
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        // 从流中读取加密数据
                        decrypted = srDecrypt.ReadToEnd();
                    }
                }
            }

            return decrypted;
        }
    }
}

运行结果:

Plain text: This is a plain text file.
Encrypted text: CBmURVStBsom9Y32wLnzLKMoeB13ukTgEpz5xcDuJ3kBOMzS7Bn2qNbS5bL/L49k
ZwceGps3FJQdFUIMDBLAyFDcsgQ8DX9Kxy9iaQgDfT2pptNNwKZY00Yj2kgj7Fyq
60XP7j/AxLgpwwXSZL2uMQ==
Decrypted text: This is a plain text file.

至此,我们完成了使用 C# 实现 AES 算法的加密和解密。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#加解密之AES算法的实现 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#七大经典排序算法系列(上)

    当我们需要对数据进行排序时,排序算法就显得非常重要。C#语言中提供了多种排序算法,我们可以根据具体场景选择不同的排序算法。本文中,我将详细介绍C#七大经典排序算法系列(上)。 七大经典排序算法 C#提供的七种经典排序算法包括: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Q…

    C# 2023年6月1日
    00
  • ASP.NET MVC重写RazorViewEngine实现多主题切换

    ASP.NET MVC框架提供了Razor视图引擎来生成HTML响应。Razor视图引擎自带的主题设置局限较大,无法实现灵活的UI主题切换。本攻略将介绍如何重写RazorViewEngine以支持多主题切换。 准备工作 创建一个名为“Themes”的文件夹,用于保存所有主题的模板文件。 创建名为ThemeViewEngine.cs的自定义视图引擎,并重写Ra…

    C# 2023年5月31日
    00
  • C#中单例的实现方法

    来讲一下C#中单例的实现方法吧。 什么是单例模式? 在软件开发中,单例模式是一种常见的设计模式。它保证一个类只有一个实例存在,并提供一个全局访问点。 单例模式应用的场景很多,比如线程池、数据库连接池等,这里不再赘述。接下来我们来看一下C#中单例的实现方法。 单例模式的实现思路 实现单例模式的关键点在于控制对象的创建过程,并且对外提供全局唯一的访问点。按照这个…

    C# 2023年6月6日
    00
  • C#中深拷贝和浅拷贝的介绍与用法

    C#中深拷贝和浅拷贝的介绍与用法 什么是拷贝? 在程序设计过程中,我们经常需要对一个对象进行复制操作,这时就需要用到拷贝操作。拷贝操作分为浅拷贝和深拷贝。其中,浅拷贝只是将对象的引用复制了一份,而深拷贝则是将对象的引用以及对象内部所有的引用都复制一遍。 浅拷贝 在C#中,浅拷贝可以通过对象的MemberwiseClone()方法实现。浅拷贝只复制引用,不复制…

    C# 2023年5月31日
    00
  • C#内置泛型委托之Func委托

    下面让我详细讲解一下“C#内置泛型委托之Func委托”的完整攻略。 Func委托是什么? 在C#中,Func委托是一种预定义的泛型委托,它可以表示一个包含任意数量输入参数和返回值类型的委托。 Func委托是从System.Func<TResult>类派生的,这个类有若干个泛型参数,最后一个泛型参数表示返回值类型,而前面的泛型参数表示输入参数的类型…

    C# 2023年5月15日
    00
  • Asp.net TreeView来构建用户选择输入的方法 推荐

    Asp.net TreeView来构建用户选择输入的方法,主要是通过构建TreeView控件来显示一个树形结构,以便用户可以通过勾选不同的节点来完成相应的选择。 下面是具体的实现步骤: 1. 创建TreeView控件 在Asp.net页面中,首先需要在WebForm中创建TreeView控件,在页面的标签内添加如下代码: <asp:TreeView I…

    C# 2023年5月31日
    00
  • C#窗体实现点餐系统

    C#窗体实现点餐系统,是一种常见的应用场景,本文将从以下几个方面详细讲解该系统的实现过程。 系统结构设计 整个系统可以分为前台展示、后台数据管理、数据库存储三部分。其中,前台展示负责向用户展示菜单和订单信息,后台数据管理负责将用户的订单信息提交至数据库中进行管理,数据库存储则负责数据的持久化存储。 前台界面设计 本系统的前台界面主要包含以下内容: 菜单展示:…

    C# 2023年6月1日
    00
  • C#集合Collections购物车Shopping Cart(实例讲解)

    C#集合Collections购物车Shopping Cart(实例讲解) 这篇文章将向您介绍如何使用C#集合实现购物车功能。购物车是电商网站中非常常见的功能之一,它允许用户将他们感兴趣的商品加入到购物车中,随时查看购物车中的商品数量和总价等信息,最终下单付款。 实现思路 为了实现购物车功能,我们需要以下几个步骤: 在页面展示商品列表,并为每个商品提供一个“…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部