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#事件管理器可以管理某一个事件的全部监听器,通过事件管理器,我们可以实现对事件监听器的添加、删除、清空等操作。本文介绍如何清空事件管理器中某个事件的全部监听器。 1. 获取事件对象 在清空事件监听器之前,我们需要首先获取对应的事件对象。事件对象是使用 event 关键字定义的。我们可以通过该对象来管理事件的监听器。 比如,我们有一个事件 MyEvent: …

    C# 2023年6月3日
    00
  • C# Console.Read()方法: 从控制台读取一个字符

    Console.Read()是C#语言中的一个控制台读取方法,它从输入流中读取下一个字符,并将其作为整数返回。它的返回值是输入的字符对应的ASCII码值。如果读取到达到输入流的末尾,则返回-1。 在使用Console.Read()方法时,需要注意以下几点: 该方法只能读取一个字符,且输入缓冲区将保留任何其他字符或回车符。 如果用户输入了多个字符,则只返回第一…

    C# 2023年4月19日
    00
  • C#中类与接口的区别讲解

    下面是”C#中类与接口的区别讲解”的完整攻略。 类和接口的定义 C#中的类是一种具有属性、方法和事件等成员的结构化数据类型,它描述了一个对象的特征和行为。而接口则是一种只定义方法签名的结构,不包含实现的成员,它定义了与类有关的一组方法、属性和事件的规范。 类的特点 类是一种实现,它可以被实例化。 类可以包含字段、属性、构造函数、方法等成员。 类支持继承,可以…

    C# 2023年6月7日
    00
  • C# FileAttributes.ReadOnly:表示文件或目录为只读文件或目录

    FileAttributes.ReadOnly 是一个枚举值,表示文件或文件夹是否为只读文件或文件夹。它主要用于设置或获取文件或文件夹的只读属性。 使用 FileAttributes.ReadOnly 可以帮助我们保护某些重要的文件或文件夹,避免它们被意外的修改或删除。 下面是对使用 FileAttributes.ReadOnly 的完整攻略: 1. 获取文…

    C# 2023年4月19日
    00
  • C#操作注册表的方法

    下面是关于C#操作注册表的方法的完整攻略。 什么是注册表 注册表是Windows操作系统中一个存储配置信息的关键数据结构。在注册表中,包含了大量的系统和软件的配置信息,比如安装路径、环境变量、文件类型、驱动程序等等。Windows系统和软件的运行状态也将会写入注册表。 在C#中,我们可以通过Registry类来访问和操作注册表。 C#操作注册表的方法 读取注…

    C# 2023年5月15日
    00
  • C#给图片加水印的简单实现方法

    下面给您详细讲解“C#给图片加水印的简单实现方法”的完整攻略。 1.安装必要的开发环境 为了进行本文的演示,我们需要安装Visual Studio开发环境、.NET框架和C#语言工具。 2.新建C#控制台应用程序项目 打开Visual Studio,点击菜单栏的“文件”-“新建”-“项目”,在弹出的对话框中选择“控制台应用程序”项目,起一个项目名称并确定,然…

    C# 2023年6月7日
    00
  • Linux CentOS下docker部署Asp.Net Core(.Net6)

    Linux CentOS下docker部署Asp.Net Core(.Net6)攻略 在本攻略中,我们将深入讲解如何在Linux CentOS下使用docker部署Asp.Net Core(.Net6),并提供两个示例说明。 步骤一:安装docker 在使用docker部署Asp.Net Core(.Net6)之前,我们需要在Linux CentOS上安装d…

    C# 2023年5月17日
    00
  • 将字符串转换成System.Drawing.Color类型的方法

    将字符串转换成System.Drawing.Color类型的方法可以使用System.Drawing.Color类中的静态方法ColorTranslator.FromHtml或ColorTranslator.FromName。 1. 使用ColorTranslator.FromHtml方法 string htmlColor = "#FF0000&q…

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