using System;
using System.Security.Cryptography;
using System.Text;
namespace XiaoFeng.Cryptography
{
/// <summary>
/// AES加密解密
/// version : 1.0.0
/// </summary>
public class AESCrypto : ICryptography
{
#region 构造器
/// <summary>
/// 无参构造器
/// </summary>
public AESCrypto()
{
this.Key = "www.zhuovi.com00";
this.IV = "www.zhuovi.com00";
this.Mode = CipherMode.CBC;
this.encoding = Encoding.Default;
}
#endregion
#region 属性
/// <summary>
/// Key
/// </summary>
public string Key { get; set; }
/// <summary>
/// IV向量
/// </summary>
public string IV { get; set; }
/// <summary>
/// 模式
/// </summary>
public CipherMode Mode { get; set; }
/// <summary>
/// 编码
/// </summary>
public Encoding encoding { get; set; }
/// <summary>
/// 静态方法
/// </summary>
public static AESCrypto AES { get { return new AESCrypto(); } }
#endregion
#region 方法
#region 加密
/// <summary>
/// 加密
/// </summary>
/// <param name="data">明文</param>
/// <param name="key">key</param>
/// <returns></returns>
public string Encrypt(string data,string key = "")
{
return this.Encrypt(data, key, this.IV);
}
/// <summary>
/// 加密
/// </summary>
/// <param name="data">明文</param>
/// <param name="key">key</param>
/// <param name="iv">向量</param>
/// <returns></returns>
public string Encrypt(string data, string key, string iv)
{
if (data.IsNullOrEmpty()) return string.Empty;
if (key.IsNullOrEmpty())
key = this.Key;
else if (key.Length < 16)
key = key.PadRight(16, '0');
else if (key.Length > 16 && key.Length < 24)
key = key.Substring(0, 16);
else if (key.Length > 24 && key.Length < 32)
key = key.Substring(0, 24);
else if (key.Length > 32)
key = key.Substring(0, 32);
if (iv.IsNullOrEmpty()) iv = this.IV;
else if (iv.Length < 16) iv = iv.PadRight(16, '0');
else if (iv.Length > 16) iv = iv.Substring(0, 16);
var _valueByte = data.GetBytes(this.encoding);
using (var aes = new RijndaelManaged())
{
aes.IV = iv.GetBytes(this.encoding);
aes.Key = key.GetBytes(this.encoding);
aes.Mode = this.Mode;
aes.Padding = PaddingMode.PKCS7;
var cryptoTransform = aes.CreateEncryptor();
var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
}
#endregion
#region 解密
/// <summary>
/// 解密
/// </summary>
/// <param name="data">密文</param>
/// <param name="key">key</param>
/// <returns></returns>
public string Decrypt(string data,string key = "")
{
return this.Decrypt(data, key, this.IV);
}
/// <summary>
/// 解密
/// </summary>
/// <param name="data">密文</param>
/// <param name="key">key</param>
/// <param name="iv">向量</param>
/// <returns></returns>
public string Decrypt(string data, string key, string iv)
{
if (data.IsNullOrEmpty()) return string.Empty;
if (key.IsNullOrEmpty())
key = this.Key;
else if (key.Length < 16)
key = key.PadRight(16, '0');
else if (key.Length > 16 && key.Length < 24)
key = key.Substring(0, 16);
else if (key.Length > 24 && key.Length < 32)
key = key.Substring(0, 24);
else if (key.Length > 32)
key = key.Substring(0, 32);
if (iv.IsNullOrEmpty()) iv = this.IV;
else if (iv.Length < 16) iv = iv.PadRight(16, '0');
else if (iv.Length > 16) iv = iv.Substring(0, 16);
var _valueByte = Convert.FromBase64String(data.Replace(" ", "+"));
using (var aes = new RijndaelManaged())
{
aes.IV = iv.GetBytes(this.encoding);
aes.Key = key.GetBytes(this.encoding);
aes.Mode = this.Mode;
aes.Padding = PaddingMode.PKCS7;
var cryptoTransform = aes.CreateDecryptor();
var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
return resultArray.GetString(this.encoding);
}
}
#endregion
#endregion
}
}
C# 加密算法AES
最新推荐文章于 2024-06-09 16:29:13 发布