c# AES字节数组加密解密流程及代码实现

下面是详细讲解“c# AES字节数组加密解密流程及代码实现”的攻略。

AES加密解密介绍

AES全称为Advanced Encryption Standard,高级加密标准,是一种对称加密算法。AES加密算法是美国超过15家组织共同研究的结果。其加密强度、安全性都很高,因此这种加密算法被广泛使用,如SSL/TLS协议加密、密码学中等等。

AES算法的加密和解密都是基于一个密钥的,这个密钥应该足够复杂以保证加密的安全性。并且加密和解密的密钥是一样的。

AES算法缺点是,密钥长度不够时,会容易被暴力破解,所以加密的时候密钥长度一般选择 256 位。

AES加密解密流程

下面是 AES加密解密流程的几个步骤:

  1. 密钥生成。使用密钥生成函数生成一个密钥。

  2. 填充数据。由于AES加密算法只能处理一定长度的数据,需要使用填充函数把数据填充到指定长度。

  3. 数据加密。将填充后的数据使用AES算法加密并生成密文。

  4. 密文传输。把密文传输到目标机器。

  5. 数据解密。接收到传输的密文后,使用同样的AES算法和密钥对数据进行解密。

  6. 数据去填充。将解密获得的数据去掉填充数据。

C# AES加密解密示例

以下是C#中使用AES算法实现字节数组加密解密示例代码:

using System;
using System.Security.Cryptography;

public static string AESEncrypt(byte[] plainBytes, string key, CipherMode mode, PaddingMode padding)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.Key = Encoding.UTF8.GetBytes(key);
    aes.Mode = mode;
    aes.Padding = padding;
    ICryptoTransform encryptor = aes.CreateEncryptor();
    byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
    return Convert.ToBase64String(cipherBytes);
}

public static byte[] AESDecrypt(string cipherText, string key, CipherMode mode, PaddingMode padding)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.Key = Encoding.UTF8.GetBytes(key);
    aes.Mode = mode;
    aes.Padding = padding;
    ICryptoTransform decryptor = aes.CreateDecryptor();
    byte[] cipherBytes = Convert.FromBase64String(cipherText);
    byte[] plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
    return plainBytes;
}

使用示例:

byte[] plainBytes = Encoding.UTF8.GetBytes("要加密的数据");
string key = "1234567890abcdef";
string cipherText = AESEncrypt(plainBytes, key, CipherMode.CBC, PaddingMode.PKCS7);
byte[] decryptedBytes = AESDecrypt(cipherText, key, CipherMode.CBC, PaddingMode.PKCS7);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);

以上示例是使用了AES算法实现了字节数组的加密和解密操作。

另一种示例

以下示例演示了如何加密解密JSON字符串:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;

public static string AESEncrypt<T>(T data, string key)
{
    try
    {
        byte[] clearBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        using (var ms = new MemoryStream())
        {
            using (var aes = new RijndaelManaged())
            {
                aes.KeySize = 256;
                aes.BlockSize = 128;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = keyBytes;
                aes.IV = keyBytes.Take(16).ToArray();
                using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                return Convert.ToBase64String(ms.ToArray());
            }
        }
    }
    catch
    {
        return default;
    }
}

public static T AESDecrypt<T>(string data, string key)
{
    try
    {
        byte[] cipherBytes = Convert.FromBase64String(data);
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        using (var ms = new MemoryStream(cipherBytes))
        {
            using (var aes = new RijndaelManaged())
            {
                aes.KeySize = 256;
                aes.BlockSize = 128;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = keyBytes;
                aes.IV = keyBytes.Take(16).ToArray();
                using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    using (var sr = new StreamReader(cs))
                    {
                        var plaintext = sr.ReadToEnd();
                        if (string.IsNullOrWhiteSpace(plaintext)) return default;
                        return JsonConvert.DeserializeObject<T>(plaintext);
                    }
                }
            }
        }
    }
    catch
    {
        return default;
    }
}

使用示例:

var dataModel = new { Name = "Alice", Age = 18, Gender = "Female" };
var key = "1234567890abcdef";
var encryptedData = AESEncrypt(dataModel, key);
var decryptedData = AESDecrypt<dynamic>(encryptedData, key);
Console.WriteLine($"Name: {decryptedData?.Name}");
Console.WriteLine($"Age: {decryptedData?.Age}");
Console.WriteLine($"Gender: {decryptedData?.Gender}");

以上示例是使用了AES算法实现了JSON字符串的加密和解密操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# AES字节数组加密解密流程及代码实现 - Python技术站

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

相关文章

  • C# Winform实现石头剪刀布游戏

    下面我将详细讲解“C#Winform实现石头剪刀布游戏”的完整攻略。 准备工作 首先,我们需要创建一个Winform应用程序,然后在窗体中添加三个按钮,分别代表石头、剪刀、布。接着,我们需要编写代码,实现石头剪刀布的逻辑。 实现过程 1.定义变量 首先,我们需要在代码中定义三个变量,分别代表石头、剪刀和布。代码如下: int rock = 1; int sc…

    C# 2023年5月15日
    00
  • C#实现中英文混合字符串截取的方法

    实现中英文混合字符串截取需要考虑到中文字符的字节数与英文字符的字节数不同,如果简单地使用字符串的截取方法,可能得到的结果会出现乱码或字串不完整的情况。下面介绍几种方法来实现中英文混合字符串截取。 1.使用Substring方法和Char.IsHighSurrogate方法 使用C#字符串类的Substring方法可以很容易地实现字符串的截取操作。然而,为了保…

    C# 2023年6月8日
    00
  • Asp.Net Core配置多环境log4net配置文件的全过程

    下面是详细讲解”Asp.Net Core配置多环境log4net配置文件的全过程”的完整攻略: 1. 引入log4net依赖 可以通过Nuget包管理器或手动安装的方式引入log4net,以Nuget包管理器为例,可以在项目中右键点击“管理NuGet程序包”,然后搜索log4net安装即可。 2. 配置log4net log4net的配置文件可以放置在多个环…

    C# 2023年6月3日
    00
  • 利用FlubuCore用C#来写DevOps脚本的方法详解

    FlubuCore是一个用于构建和部署.NET应用程序的开源工具。它使用C#编写,可以帮助我们编写DevOps脚本,自动化构建和部署过程。在本文中,我们将介绍如何使用FlubuCore编写DevOps脚本,并提供两个示例说明。 安装FlubuCore 在开始之前,我们需要安装FlubuCore。我们可以使用NuGet包管理器或手动下载安装程序包。在Visua…

    C# 2023年5月17日
    00
  • 基于NET Core 的Nuget包制作、发布和运用流程解析(完整过程)

    基于.NET Core的NuGet包制作、发布和运用流程解析(完整过程) 什么是NuGet包 NuGet 是一个基于 .NET 的开源包管理器,旨在帮助开发者能够更方便地添加、移除和更新项目中的依赖库。可以通过 NuGet 包管理器获取和安装其他开发者分发的 NuGet 包。NuGet 包中包含可重用的代码,该代码可以被添加到多个项目中使用,提高代码的重用性…

    C# 2023年6月3日
    00
  • 基于ajax与msmq技术的消息推送功能实现代码

    我可以为你提供一份详细的基于ajax与msmq技术的消息推送功能实现代码攻略。 简介 基于ajax与msmq技术的消息推送功能,本质上是一种实时通信(real-time communication)的方式。通常情况下,网页通信是通过http协议和服务器进行的,即客户端只能在一定的时间间隔内向服务器发送请求,服务器就会在收到请求时返回数据。而基于ajax与ms…

    C# 2023年6月6日
    00
  • C# 修改文件的创建、修改和访问时间的示例

    下面是在C#中修改文件的创建、修改和访问时间的示例: 修改文件创建、修改和访问时间 using System; using System.IO; class Program { static void Main() { // 指定要修改时间的文件路径 string filePath = "test.txt"; // 获取当前时间 Date…

    C# 2023年6月1日
    00
  • C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)

    C#操作SQLite数据库方法小结 创建数据库 要创建一个SQLite数据库,我们需要使用System.Data.SQLite.Core库中的SQLiteConnection类。例如,要创建一个名为“myDatabase.db”的数据库,可以使用以下代码: using System.Data.SQLite; string connectionString =…

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