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#使用ML.Net完成人工智能预测

    C#可以使用ML.Net来实现人工智能预测,下面是一些基本的步骤: 1.安装ML.Net。可以通过Visual Studio NuGet包管理器或者官网下载进行安装。 2.准备数据。可以使用Microsoft Excel进行数据采集和整理,将数据存储到CSV格式或者SQL Server数据库中。 3.定义数据结构。为了训练和预测模型,需要定义数据结构。例如,…

    C# 2023年5月15日
    00
  • C# WPF数据绑定方法以及重写数据模板后数据绑定

    写在前面 本文将会介绍WPF如何实现前后端数据绑定和在进行数据绑定时常用的方法和类以及对于DataGrid、ListView这样的控件重写数据模板后控件如何进行数据绑定。 本文主要针对于数据绑定的基础实现进行介绍,通过此博文你将会有能力编写一个MVVM设计模式的C#、WPF项目。如果您是C#及WPF的资深开发人员本文可能对您没有太大的帮助,但如果你是一个正在…

    C# 2023年4月17日
    00
  • iis6网站属性没有asp.net选项卡的解决办法

    在IIS6中,有时候会出现网站属性没有ASP.NET选项卡的情况,这可能会导致无法配置ASP.NET应用程序。本文将提供详细的“iis6网站属性没有asp.net选项卡的解决办法”的完整攻略,包括如何解决此问题,以及示例代码。 解决办法 解决iis6网站属性没有asp.net选项卡的问题需要以下步骤: 安装ASP.NET。 注册ASP.NET。 安装ASP.…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月25日
    00
  • 在.NET Core使用 HttpClient 的正确方式

    前言 HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类,用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法,如 GET、POST、PUT 和 DELETE,可以很容易地构造和发送 HTTP 请求,并处理响应数据。它是我们比较常用的官方HTTP请求组件,那么你们都正确…

    C# 2023年4月17日
    00
  • ASP.NET Core使用EF查询数据

    下面是关于“ASP.NET Core使用EF查询数据”的完整攻略,分为以下几个部分: 环境配置 创建数据库 安装EF 使用EF查询数据 1. 环境配置 在使用ASP.NET Core开发前,需要进行环境配置,具体步骤如下: 安装Visual Studio 2017或更高版本 下载安装.NET Core SDK 安装ASP.NET Core模板 2. 创建数据…

    C# 2023年6月3日
    00
  • .NET Framework各版本(.NET2.0 3.0 3.5 4.0)区别

    下面是关于“.NET Framework各版本(.NET 2.0、3.0、3.5、4.0)区别”的完整攻略,包含两个示例。 1. .NET Framework各版本区别 .NET Framework是一个由Microsoft开发的应用程序框架,用于在Windows操作系统上开发和运行各种类型的应用程序。下面是.NET Framework各版本的区别: .NE…

    C# 2023年5月15日
    00
  • c# 实现获取汉字十六进制Unicode编码字符串的实例

    获取汉字十六进制Unicode编码字符串,可以使用C#语言的内置功能来实现。下面是实现该功能的完整攻略: 步骤1:导入命名空间 在C#程序中,需要导入System.Text命名空间来使用字符串编码相关的类。 using System.Text; 步骤2:获取汉字十六进制Unicode编码字符串 使用Encoding.Unicode.GetBytes()方法可…

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