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#入门之循环语句使用详解(for循环、do/while)

    C#入门之循环语句使用详解(for循环、do/while) 引言 在编写程序的过程中,经常需要对某些语句进行重复的执行,这时候就需要使用循环语句。本文将详细讲解C#中for循环和do/while循环的使用。 for循环 for循环是最基本的循环语句之一,在C#中也有完整的语法: for (initialization; condition; incremen…

    C# 2023年5月31日
    00
  • C# Linq的ToList()方法 – 将序列转换为列表

    C# Linq的ToList()方法详解 ToList()方法是C#中Linq查询的扩展方法之一,它将一个序列转换成一个List集合,实现方式是创建一个包含序列中所有元素的新实例。该方法的通用使用方式如下所示: public static List<TSource> ToList<TSource>(this IEnumerable&l…

    C# 2023年4月19日
    00
  • C# DateTime.Now方法: 获取当前日期和时间

    C#中DateTime.Now的作用和使用方法 DateTime.Now 是 C# 中的一个静态属性,用于获取当前系统的日期和时间信息。 例如: DateTime now = DateTime.Now; Console.WriteLine(now); 输出: 2022/1/31 10:37:02 我们可以看到输出的格式为“年/月/日 时:分:秒”。 下面是 …

    C# 2023年4月19日
    00
  • C#中timer定时器用法实例

    C#中timer定时器用法实例 简介 C#中的timer定时器用于在指定时间间隔内重复执行某些代码,非常常用。下面将详细讲解timer的用法以及两个实例。 用法 C#中的timer定时器主要分为两种:System.Threading.Timer和System.Timers.Timer。这两种timer主要的区别是使用方式不同。下面分别进行介绍。 System…

    C# 2023年6月1日
    00
  • C/C++数据对齐详细解析

    C/C++数据对齐详细解析 数据对齐是指在计算机中,为了提高CPU对齐内存操作的速度和效率,编译器在为结构体或类分配内存时,会按照一定的规则把各个成员变量存储到内存中。本文将通过对C/C++数据对齐原理进行详细讲解,并提供两条示例说明。 数据对齐的基本原理 数据对齐是因为CPU在访问内存时,访问未对齐的内存会比对齐的内存更慢。为了访问内存更加高效,CPU要求…

    C# 2023年6月8日
    00
  • 简单聊一聊Go语言中的数组和切片

    简单聊一聊Go语言中的数组和切片 在Go语言中,数组和切片是两种常用的数据结构。本文将提供一个详细的Go语言中数组和切片的攻略,包括定义、初始化、访问、遍历、添加、删除等操作。 数组 定义和初始化 在Go语言中,数组是一种固定长度的数据结构,可以存储相同类型的元素。可以按照以下方式定义和初始化数组: var arr [5]int // 定义一个长度为5的in…

    C# 2023年5月15日
    00
  • C#利用正则判断输入是否为纯数字、容器类

    在C#中,利用正则表达式可以方便地判断输入是否为纯数字或容器类。本文将详细讲解C#利用正则判断输入是否为纯数字、容器类的完整攻略,包括两个示例。 判断输入是否为纯数字 要判断输入是否为纯数字,可以使用正则表达式。以下是一个判断输入是否为纯数字的示例: string input = "12345"; bool isNumeric = Reg…

    C# 2023年5月15日
    00
  • asp.net 用户控件读取以及赋值

    让我们来详细讲解一下如何读取和赋值 ASP.NET 用户控件。 什么是 ASP.NET 用户控件? ASP.NET 用户控件是由 ASP.NET 页面和服务器控件组成的。它们是可重用的模块,可以在多个页面中使用,并且可以像其他服务器控件一样自定义和配置。用户控件通常用于在多个页面中使用相同的用户界面元素。 如何创建 ASP.NET 用户控件? 要创建 ASP…

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