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日

相关文章

  • C# WinForm窗口最小化到系统托盘

    让我为您详细讲解一下“C# WinForm窗口最小化到系统托盘”的完整攻略。 基本思路 将窗口最小化到系统托盘需要用到以下两个类: NotifyIcon: 系统托盘图标类,用于在系统托盘中显示图标。 ContextMenuStrip: 右键菜单类,用于为系统托盘图标添加右键菜单。 基本的思路是,在窗口最小化时,将窗口隐藏并在系统托盘中显示一个图标,当用户单击…

    C# 2023年6月6日
    00
  • C#采用递归实现阶乘的方法

    C#采用递归实现阶乘的方法 递归是一种程序设计方法,其优点是可以让问题变得更简单,同时也有助于降低程序的复杂度。在C#中,使用递归来实现阶乘是一种非常直观的方法。在本文中,我们将讲解如何使用C#来实现递归阶乘的方法。 递归的基本定义 递归(Recursion),是指函数自己调用自己,每次调用时传入不同的变量。通俗点说就是一个函数在执行的过程中会调用自身。 递…

    C# 2023年6月6日
    00
  • C#中设计、使用Fluent API

    设计和使用Fluent API是C#的一个非常重要的特性,它可以极大地提升我们代码的可读性和可维护性。在本篇文章中,我将为大家详细讲解如何在C#中设计和使用Fluent API,并提供两个示例说明。 Fluent API是什么 Fluent API是一种使用方法链的API设计风格,它允许我们编写从上到下的代码,使得我们的逻辑更易于理解和调整。 与传统的API…

    C# 2023年6月7日
    00
  • C#的Excel导入、导出

    下面给您详细讲解C#中的Excel导入和导出的完整攻略。 导入Excel 使用第三方库 要导入Excel文件到C#程序中,常用的做法是使用第三方库。其中比较常用的库有: NPOI:NPOI是C#的开源库,用于按照Microsoft Office的公开标准读写Excel文件。功能强大,支持.xls、.xlsx、.ppt、.pptx、.doc和.docx等Off…

    C# 2023年5月15日
    00
  • C#并行编程之信号量

    下面将详细讲解C#并行编程之信号量的完整攻略。 1. 什么是信号量 信号量是一种常见的线程同步机制,它可以限制同时访问共享资源的线程数量。在C# 中,我们可以通过System.Threading.Semaphore类来实现信号量机制。 2. 如何使用信号量 使用Semaphore类,可以在C# 中实现信号量机制。Semaphore类提供两个主要的方法Wait…

    C# 2023年6月1日
    00
  • C#11新特性预览及使用介绍

    C# 11新特性预览及使用介绍 介绍 C# 11新特性加入了一些新的语言特性,使得C#语言更具表达力和灵活性。在本文中,我们将介绍C# 11的一些新功能并演示如何使用它们。 新特性 1. 本地函数的支持 C# 10已经支持了本地函数的语法,但在C# 11中,我们可以在本地函数中使用“拓展方法”。具体而言,我们可以在本地函数中使用类的拓展方法。 例如,我们需要…

    C# 2023年5月14日
    00
  • ASP.NET Core MVC 从入门到精通之接化发(一)

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

    C# 2023年4月18日
    00
  • 利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)

    首先我们来分析一下题目中提到的问题:“修复UEditor编辑时Bug”。根据题目可知,我们需要解决的是UEditor编辑时的Bug。具体来说就是在使用UEditor编辑文本时出现的问题,在这篇文章中我们需要解决该问题并修复。 接着,我们来看“利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)”这个标题,它告诉我们…

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