admin管理员组文章数量:1639930
/// <summary>
/// AES 加密解密拓展方法
/// </summary>
public static class EncryptionExtension
{
/// <summary>
/// AES加密,并且有向量
/// </summary>
/// <param name="encrypteStr">需要加密的明文</param>
/// <param name="key">秘钥</param>
/// <param name="vector">向量</param>
/// <returns>密文</returns>
public static string AESEncryptedString(this string encrypteStr, string key, string vector)
{
byte[] aesBytes = Encoding.UTF8.GetBytes(encrypteStr);
byte[] aesKey = new byte[32];
//直接转
Array.Copy(Convert.FromBase64String(key), aesKey, aesKey.Length);
byte[] aesVector = new byte[16];
//直接转
Array.Copy(Convert.FromBase64String(vector), aesVector, aesVector.Length);
Rijndael Aes = Rijndael.Create();
//或者采用下方生成Aes
//RijndaelManaged Aes = new();
// 开辟一块内存流
using MemoryStream memoryStream = new MemoryStream();
// 把内存流对象包装成加密流对象
using CryptoStream cryptoStream = new(memoryStream, Aes.CreateEncryptor(aesKey, aesVector), CryptoStreamMode.Write);
// 明文数据写入加密流
cryptoStream.Write(aesBytes, 0, aesBytes.Length);
cryptoStream.FlushFinalBlock();
string result = Convert.ToBase64String(memoryStream.ToArray());
return result;
}
/// <summary>
/// AES解密,并且有向量
/// </summary>
/// <param name="decryptStr">被加密的明文</param>
/// <param name="key">秘钥</param>
/// <param name="vector">向量</param>
/// <returns>明文</returns>
public static string AESDecryptString(this string decryptStr, string key, string vector)
{
byte[] aesBytes = Convert.FromBase64String(decryptStr);
byte[] aesKey = new byte[32];
//直接转,可采用不同的方法,但是需与加密方法一致
Array.Copy(Convert.FromBase64String(key), aesKey, aesKey.Length);
byte[] aesVector = new byte[16];
//直接转,可采用不同的方法,但是需与加密方法一致
Array.Copy(Convert.FromBase64String(vector), aesVector, aesVector.Length);
Rijndael Aes = Rijndael.Create();
//或者采用下方生成Aes
//RijndaelManaged Aes = new();
// 开辟一块内存流,存储密文
using MemoryStream memoryStream = new(aesBytes);
// 把内存流对象包装成加密流对象
using CryptoStream Decryptor = new(memoryStream, Aes.CreateDecryptor(aesKey, aesVector), CryptoStreamMode.Read);
// 明文存储区
using MemoryStream originalMemory = new();
byte[] Buffer = new byte[1024];
int readBytes = 0;
while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)
{
originalMemory.Write(Buffer, 0, readBytes);
}
byte[] original = originalMemory.ToArray();
string result = Convert.ToBase64String(originalMemory.ToArray());
return result;
}
/// <summary>
/// AES加密(无向量)
/// </summary>
/// <param name="encrypteStr">需要加密的明文</param>
/// <param name="key">密钥</param>
/// <returns>密文</returns>
public static string AESEncryptedString(this string encrypteStr, string key)
{
byte[] aesBytes = Encoding.UTF8.GetBytes(encrypteStr);
byte[] aesKey = new byte[32];
//直接转
//Array.Copy(Convert.FromBase64String(key), aesKey, aesKey.Length);
//当长度不够时,右侧添加空格
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(aesKey.Length)), aesKey, aesKey.Length);
using MemoryStream memoryStream = new();
Rijndael Aes = Rijndael.Create();
//或者采用下方生成Aes
//RijndaelManaged Aes = new();
Aes.Mode = CipherMode.ECB;
Aes.Padding = PaddingMode.PKCS7;
Aes.KeySize = 128;
Aes.Key = aesKey;
using CryptoStream cryptoStream = new(memoryStream, Aes.CreateEncryptor(), CryptoStreamMode.Write);
cryptoStream.Write(aesBytes, 0, aesBytes.Length);
cryptoStream.FlushFinalBlock();
Aes.Clear();
return Convert.ToBase64String(memoryStream.ToArray());
}
/// <summary>
/// AES解密(无向量)
/// </summary>
/// <param name="decryptStr">被加密的明文</param>
/// <param name="key">密钥</param>
/// <returns>明文</returns>
public static string AESDecryptString(this string decryptStr, string key)
{
byte[] aesBytes = Convert.FromBase64String(decryptStr);
byte[] aesKey = new byte[32];
//需要跟加密一致
//直接转
//Array.Copy(Convert.FromBase64String(key), aesKey, aesKey.Length);
//当长度不够时,右侧添加空格
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(aesKey.Length)), aesKey, aesKey.Length);
using MemoryStream memoryStream = new(aesBytes);
Rijndael Aes = Rijndael.Create();
//或者采用下方生成Aes
//RijndaelManaged Aes = new();
Aes.Mode = CipherMode.ECB;//需与加密方法一致
Aes.Padding = PaddingMode.PKCS7;//需与加密方法一致
Aes.KeySize = 128;
Aes.Key = aesKey;
using CryptoStream cryptoStream = new(memoryStream, Aes.CreateDecryptor(), CryptoStreamMode.Read);
byte[] temp = new byte[aesBytes.Length + 32];
int len = cryptoStream.Read(temp, 0, aesBytes.Length + 32);
byte[] ret = new byte[len];
Array.Copy(temp, 0, ret, 0, len);
Aes.Clear();
string result = Encoding.UTF8.GetString(ret);
return result;
}
}
本文标签: AES
版权声明:本文标题:C# AES 加密 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729294696a1194580.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论