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#获取带汉字的字符串真实长度(单个英文长度为1,单个中文长度为2)

    首先介绍下如何用C#获取一个字符串的真实长度,在C#中可以使用String类中的Length属性来获取字符串的长度,但是需要注意的是Length属性返回的是字符串中字符的数量而不是字节数量。为了获取字符串的字节数量,可以使用Encoding类提供的GetBytes方法来获取字符串的字节数组,然后通过计算该数组的长度来得到字符串的字节数量。 具体的做法可以使用…

    C# 2023年6月8日
    00
  • asp.net子窗体与父窗体交互实战分享

    ASP.NET 子窗体与父窗体交互实战分享 本文主要介绍ASP.NET中子窗体与父窗体交互的实现方法。涉及到了IFrame嵌套、控件之间的通信等具体技术细节。 IFrame父子窗体嵌套实现方式 父子窗体嵌套方式主要有两种,一种是利用IFrame实现,另一种则是采用模态窗口的方式。这里介绍第一种方式。 在ASP.NET中,可以在主页面中嵌入一个IFrame页面…

    C# 2023年6月3日
    00
  • C++ 和 C# 中的 lambda的方法技巧

    C++和C#中lambda表达式都是一种可以在运行时定义匿名函数的语法,它所属的范畴属于闭包。在函数式编程中,lambda表达式可以替代匿名函数来传递操作。下面将分别对C++和C#中的lambda表达式进行详细讲解。 C++中的lambda表达式 在C++11中,lambda表达式的语法为: [capture list] (parameters) ->…

    C# 2023年5月15日
    00
  • C#基于Socket实现多人聊天功能

    下面为您介绍详细的”C#基于Socket实现多人聊天功能”攻略。 介绍 聊天功能是现代各种即时通信软件的核心功能,很多开发者也想在自己的应用中添加聊天功能。本攻略将通过C#基于Socket实现多人聊天功能。 准备工作 .Net开发环境,带有Visual Studio的更好,如果没有可以在官网上下载安装。 具有Socket编程知识。 实现步骤 第一步:创建So…

    C# 2023年6月7日
    00
  • ASP.NET Core环境变量配置和启动设置讲解

    ASP.NET Core环境变量配置和启动设置讲解 在ASP.NET Core应用程序中,环境变量和启动设置是非常重要的。本攻略将详细介绍如何在ASP.NET Core应用程序中配置环境变量和启动设置,并提供两个示例说明。 配置环境变量 在ASP.NET Core应用程序中,可以使用环境变量来配置应用程序的行为。可以按照以下步骤操作: 在appsetting…

    C# 2023年5月16日
    00
  • 详解VS2017 Linux 上.NET Core调试

    详解VS2017 Linux 上.NET Core调试 在本攻略中,我们将详细介绍如何使用Visual Studio 2017在Linux上调试.NET Core应用程序。我们将介绍如何配置调试环境、如何在Visual Studio中设置调试器,并提供两个示例说明。 配置调试环境 在将.NET Core应用程序调试到Linux上之前,需要进行以下准备工作: …

    C# 2023年5月16日
    00
  • C# StringBuilder.Append()方法: 将一个字符串追加到 StringBuilder 对象的末尾

    StringBuilder是C#中用来动态生成字符串的类,可以有效地避免字符串拼接等操作因为频繁创建新的字符串对象而造成的性能问题。StringBuilder类有多种方法可以用来操作字符串,其中Append()是最常用的方法之一。 Append()方法的作用 StringBuilder.Append()方法用于在已有字符串的末尾追加新的内容。具体来说,就是将…

    C# 2023年4月19日
    00
  • .NET Reflector8.5怎么激活?.NET Reflector安装激活使用详细图文教程

    以下是详细讲解 “.NET Reflector 8.5怎么激活?.NET Reflector安装激活使用详细图文教程” 的完整攻略。 安装.NET Reflector 8.5 首先,我们需要从官方网站下载最新版本的.NET Reflector 8.5并安装它。 获取激活码 然后,我们需要获取一个有效的激活码。你可以从官方网站购买一个许可证,也可以在互联网上寻…

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