C# 加密算法AES

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
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的AES加密算法实现主要基于System.Security.Cryptography命名空间下的Aes类。它提供了两种模式,分别是CBC和ECB模式,其中CBC模式需要指定一个初始化向量(IV)。下面是一个简单的示例代码: ```csharp using System; using System.Security.Cryptography; using System.Text; public class AesEncryption { public static string Encrypt(string plainText, string key, string iv) { byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); using (Aes aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = ivBytes; aes.Mode = CipherMode.CBC; ICryptoTransform encryptor = aes.CreateEncryptor(); byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); string encryptedText = Convert.ToBase64String(encryptedBytes); return encryptedText; } } public static string Decrypt(string encryptedText, string key, string iv) { byte[] encryptedBytes = Convert.FromBase64String(encryptedText); byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); using (Aes aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = ivBytes; aes.Mode = CipherMode.CBC; ICryptoTransform decryptor = aes.CreateDecryptor(); byte[] plainBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); string plainText = Encoding.UTF8.GetString(plainBytes); return plainText; } } } ``` 在上面的代码中,我们通过调用Create()方法来创建一个Aes对象,并设置其Key、IV和Mode属性。然后我们使用CreateEncryptor()方法创建一个加密器对象,使用TransformFinalBlock()方法进行加密操作。解密操作则是使用CreateDecryptor()方法创建一个解密器对象,同样使用TransformFinalBlock()方法进行解密操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值