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#操作注册表的方法详解

    C#操作注册表的方法详解 什么是注册表 注册表是Windows操作系统中的一个重要组成部分,用于存储系统和应用程序的各种配置信息,包括系统硬件、软件和用户设置等。其中,注册表是由一些键(key)和值(value)组成的,它们类似于树形结构的路径和对应的数据,我们可以通过访问这些键和值来获取和修改系统和应用程序的设置信息。 C#操作注册表的方法 在C#中,我们…

    C# 2023年5月15日
    00
  • webpack-dev-server核心概念案例详解

    webpack-dev-server核心概念案例详解 webpack-dev-server是一个基于Node.js的开发服务器,它可以实时重新加载页面,提高开发效率。本文将详细讲解webpack-dev-server的核心概念,并提供两个示例。 1. 安装webpack-dev-server 在使用webpack-dev-server之前,需要先安装它。可以…

    C# 2023年5月15日
    00
  • C# 使用Fluent API 创建自己的DSL(推荐)

    当我们需要处理某些特定的问题时,我们可以使用一种特定的编程语言或工具,这种语言或工具专门用于解决此类问题。但是在使用这种特定语言或工具的情况下,我们可能会受到限制,因为只能使用特定的语法和工具。因此,我们可以使用DSL(Domain Specific Language,领域特定语言)来解决这个问题。DSL是一种针对特定领域的编程语言,可以让我们在这个领域内拥…

    C# 2023年6月7日
    00
  • C# BinaryReader.Read – 读取基本数据类型

    BinaryReader.Read 方法的作用 BinaryReader 是一个用于读取二进制数据的类。它提供了不同数据类型的读取方法,其中就包括了 Read 方法。 BinaryReader.Read 方法的作用是:从当前流中读取任意类型的数据。此方法从流中读取一个或多个字节,而每个字节都用来构建指定类型的值。 使用方法攻略 为正确使用 BinaryRea…

    C# 2023年4月19日
    00
  • C#实现猜数字小游戏

    C#实现猜数字小游戏 简介 猜数字小游戏是一种经典的游戏,玩家需要通过猜测数字来获得游戏胜利。在这个小游戏的实现过程中,我们使用C#语言,通过控制台进行交互。 实现过程 确定游戏规则 在开始实现之前,我们需要确定游戏的规则。猜数字小游戏的规则可以如下: 游戏系统会生成一个随机数字,范围为1-100之间 玩家需要通过输入数字来猜出系统生成的随机数字 如果玩家猜…

    C# 2023年6月1日
    00
  • C#实现简单串口通信

    为了实现串口通信,首先需要掌握C#中的串口通信相关类和方法。常用的类有SerialPort和SerialDataReceivedEventArgs,常用的方法有Open和Write等。下面分步骤讲解实现串口通信的完整攻略。 1. 新建C#控制台应用程序 首先,打开Visual Studio,新建一个C#控制台应用程序。选择“新建项目”–>“Visua…

    C# 2023年6月7日
    00
  • C#基本概念列举详解

    C#基本概念列举详解 什么是C#? C#是由微软公司开发和维护的一种现代编程语言。C#最初发布于2000年,旨在成为Windows桌面应用程序开发领域的首选语言。C#是一种跨平台语言,可在Windows、Linux和Mac OS等各种操作系统上运行。C#具有很多现代编程语言的特性,例如自动内存管理、强类型、泛型和LINQ查询。 C#的主要特性 C#包含许多高…

    C# 2023年6月1日
    00
  • C# GroupBy的基本使用教程

    C# GroupBy的基本使用教程 简介 GroupBy是LINQ查询中常用的操作,可以将序列按照一定的规则分组,返回一个以分组为键,子序列为值的字典。 基本使用 对于一个集合,我们可以使用GroupBy方法对其进行分组。以下是GroupBy方法的基本语法: IEnumerable<IGrouping<TKey, TElement>>…

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