C#实现对AES加密和解密的方法

首先,C#实现对AES加密和解密需要使用 System.Security.Cryptography 命名空间中提供的 Aes 类。下面是具体的实现步骤:

1. 导入命名空间

using System.Security.Cryptography;

2. 创建 Aes 对象

Aes aes = Aes.Create();

3. 设置密钥和向量

密钥和向量是 AES 加密时需要的两个参数,可以自己设置或者使用随机生成的值。需要注意的是,密钥和向量的长度必须符合 AES 算法要求。

// 设置密钥,默认长度为 256 位
aes.Key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");

// 设置向量,默认长度为 128 位
aes.IV = Encoding.UTF8.GetBytes("1234567890123456");

4. 创建加密器和解密器

在创建加密和解密器之前,需要设置加密模式和填充方式。

// 设置加密模式为 CBC
aes.Mode = CipherMode.CBC;

// 设置填充方式为 PKCS7
aes.Padding = PaddingMode.PKCS7;

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

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

5. 加密数据

string plainText = "hello world";

// 转换明文数据为字节数组
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

// 加密数据
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

// 转换加密后的字节数组为 Base64 编码的字符串
string cipherText = Convert.ToBase64String(cipherBytes);

6. 解密数据

// 转换 Base64 编码的字符串为字节数组
byte[] cipherBytes = Convert.FromBase64String(cipherText);

// 解密数据
byte[] plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);

// 转换解密后的字节数组为明文字符串
string plainText = Encoding.UTF8.GetString(plainBytes);

下面是两条具体的示例说明:

示例一:使用随机生成的密钥和向量加密和解密数据

// 创建 Aes 对象
Aes aes = Aes.Create();

// 设置加密模式和填充方式
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;

// 随机生成密钥和向量
aes.GenerateKey();
aes.GenerateIV();

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

// 明文数据
string plainText = "hello world";

// 加密数据
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

// 解密数据
byte[] decryptedBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);

Console.WriteLine("明文数据:{0}", plainText);
Console.WriteLine("加密后数据:{0}", Convert.ToBase64String(cipherBytes));
Console.WriteLine("解密后数据:{0}", decryptedText);

示例二:使用自定义密钥和向量加密和解密数据

// 创建 Aes 对象
Aes aes = Aes.Create();

// 设置加密模式和填充方式
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;

// 设置密钥和向量
byte[] key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");
aes.Key = key;
aes.IV = iv;

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

// 明文数据
string plainText = "hello world";

// 加密数据
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

// 解密数据
byte[] decryptedBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);

Console.WriteLine("明文数据:{0}", plainText);
Console.WriteLine("加密后数据:{0}", Convert.ToBase64String(cipherBytes));
Console.WriteLine("解密后数据:{0}", decryptedText);

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

(2)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Unity3D 单例模式和静态类的使用详解

    《Unity3D单例模式和静态类的使用详解》是一篇介绍Unity3D中单例模式和静态类的文章。在Unity3D中,单例模式和静态类都是非常常用的设计模式,它们可以帮助我们更好地管理游戏对象和数据,提高代码的可维护性和可扩展性。 1. 单例模式的使用 1.1 单例模式的定义 单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供全局访问点。 1.…

    C# 2023年5月15日
    00
  • C#中ArrayList 类的使用详解

    C#中ArrayList 类的使用详解 简介 在C#中,ArrayList类是一个动态数组。它与普通数组使用方法相似,但是具有更高的灵活性。在ArrayList中,可以添加、删除和插入元素,而且不需要预定义数组大小。 ArrayList类与其他集合类(如List、Dictionary等)相比,具有一些缺点。因为ArrayList是一个对象数组,因此它不适用于…

    C# 2023年6月6日
    00
  • 实现ASP.NET多文件上传程序代码

    实现ASP.NET多文件上传程序是一个常见的需求,可以通过以下步骤来实现: 页面设计 首先,在ASP.NET页面上添加文件上传控件,代码如下: <div> <asp:Label ID="lblUpload" runat="server" Text="Upload files:"&g…

    C# 2023年5月31日
    00
  • Unity登录注册时限制发送验证码次数功能的解决方法

    Unity登录注册时限制发送验证码次数功能的解决方法可以通过以下几步实现: 1. 设计数据库结构 在设计数据库时,为用户表添加两个属性字段,一个是上次发送验证码时间,一个是发送验证码次数。例如: CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) NOT NUL…

    C# 2023年6月3日
    00
  • c#中Winform实现多线程异步更新UI(进度及状态信息)

    C#中的Winform实现多线程异步更新UI(进度及状态信息)需要遵循以下步骤: 使用BackgroundWorker控件创建异步线程 在异步线程完成工作时,使用ReportProgress方法传递进度信息 在主线程中处理进度信息并更新UI 在异步线程完成工作后,使用RunWorkerCompleted事件处理线程完成状态 下面解释一下每个步骤: 1. 使用…

    C# 2023年6月6日
    00
  • LINQ基础之From和GroupBy子句

    下面给出详细的 “LINQ基础之From和GroupBy子句” 的攻略: From子句 from 子句用来指定数据源和创建一个范围变量,它负责查询和返回一个序列。 下面是一个示例,通过使用 from 子句从一个整数数组中选择所有大于 5 的数字: int[] numbers = { 2, 3, 5, 7, 11, 13 }; var result = fro…

    C# 2023年6月1日
    00
  • WinForm使用DecExpress控件中的ChartControl插件绘制图表

    WinForm使用DevExpress控件中的ChartControl插件绘制图表的攻略可以分为以下几个步骤: 获取Devexpress控件和ChartControl插件首先需要去Devexpress官网下载控件和ChartControl插件,下载完成后可以进行安装和注册,然后在我们的WinForm应用程序中添加控件引用。 添加ChartControl控件到…

    C# 2023年6月1日
    00
  • C# 检索不区分大小写并高亮显示实例详解

    在C#中,我们可以使用正则表达式来实现检索不区分大小写并高亮显示的功能。以下是实现该功能的步骤: 步骤1:引入命名空间 using System.Text.RegularExpressions; 在上面的示例中,我们引入了System.Text.RegularExpressions命名空间,该命名空间包含了正则表达式相关的类和方法。 步骤2:编写检索代码 s…

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