下面是详细讲解“c# AES字节数组加密解密流程及代码实现”的攻略。
AES加密解密介绍
AES全称为Advanced Encryption Standard,高级加密标准,是一种对称加密算法。AES加密算法是美国超过15家组织共同研究的结果。其加密强度、安全性都很高,因此这种加密算法被广泛使用,如SSL/TLS协议加密、密码学中等等。
AES算法的加密和解密都是基于一个密钥的,这个密钥应该足够复杂以保证加密的安全性。并且加密和解密的密钥是一样的。
AES算法缺点是,密钥长度不够时,会容易被暴力破解,所以加密的时候密钥长度一般选择 256 位。
AES加密解密流程
下面是 AES加密解密流程的几个步骤:
-
密钥生成。使用密钥生成函数生成一个密钥。
-
填充数据。由于AES加密算法只能处理一定长度的数据,需要使用填充函数把数据填充到指定长度。
-
数据加密。将填充后的数据使用AES算法加密并生成密文。
-
密文传输。把密文传输到目标机器。
-
数据解密。接收到传输的密文后,使用同样的AES算法和密钥对数据进行解密。
-
数据去填充。将解密获得的数据去掉填充数据。
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技术站