zoukankan      html  css  js  c++  java
  • 【加密算法】AES

    一、简介

    AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。

    用AES加密2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的 AES。Rijndael是在1999年下半年,由研究员Joan Daemen 和 Vincent Rijmen 创建的。AES正日益成为加密各种形式的电子数据的实际标准。

    美国标准与技术研究院(NIST)于2002年5月26日制定了新的高级加密标准(AES)规范。

    AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

    AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。

    与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

    二、实现

    /// <summary>
    /// AES加解密
    /// ECB模式,偏移向量不起作用
    /// 当前代码的密钥、偏移向量不可以含有中文
    /// 如需跟java、php通用加解密,参数需一致
    /// </summary>
    public class AesHelper
    {
        //默认密钥、初始化向量
        private static readonly string _Key = "Q3zmD8v^LWYu5QsX";   //默认密钥 长度可为16位、24位、32位
        private static readonly string _Vector = "figQi#gxIxqcnaKr";    //默认偏移向量 长度为16位
    
        /// <summary>
        /// AES加密
        /// 密码:默认
        /// 偏移量:默认
        /// 模式:CBC
        /// 填充:PKCS7
        /// 输出:Base64
        /// 编码:UTF8
        /// </summary>
        /// <param name="plaintext">明文</param>
        /// <returns>大写的密文</returns>
        public static string Encrypt(string plaintext)
        {
            return Encrypt(plaintext, _Key, _Vector);
        }
    
        /// <summary>
        /// AES加密
        /// 密码:默认
        /// 偏移量:默认
        /// 模式:CBC
        /// 填充:PKCS7
        /// 输出:自定义
        /// 编码:UTF8
        /// </summary>
        /// <param name="plaintext">明文</param>
        /// <returns>大写的密文</returns>
        public static string Encrypt(string plaintext, OutputMethod method)
        {
            return Encrypt(plaintext, _Key, _Vector, method);
        }
    
    
        /// <summary>
        /// AES加密
        /// 密码:自定义
        /// 偏移量:自定义
        /// 模式:CBC
        /// 填充:PKCS7
        /// 输出:Base64
        /// 编码:UTF8
        /// </summary>
        /// <param name="plaintext">明文</param>
        /// <param name="key">密码,16、24、32位,不含中文</param>
        /// <param name="iv">偏移量,16位,不含中文</param>
        /// <param name="cipher">加密模式</param>
        /// <param name="padding">填充</param>
        /// <returns></returns>
        public static string Encrypt(string plaintext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            if (String.IsNullOrEmpty(plaintext))
            {
                throw new ArgumentNullException("明文不能为空");
            }
    
            Encoding encoding = Encoding.UTF8;
            byte[] byteContent = encoding.GetBytes(plaintext);
            byte[] byteKey = encoding.GetBytes(key);
            byte[] byteIV = encoding.GetBytes(iv);
    
            Rijndael rjd = Rijndael.Create();
            rjd.Key = byteKey;
            rjd.IV = byteIV;
            rjd.Mode = cipher;
            rjd.Padding = padding;
    
            using (MemoryStream ms = new MemoryStream())
            {
                CryptoStream cStream = new CryptoStream(ms, rjd.CreateEncryptor(), CryptoStreamMode.Write);
                cStream.Write(byteContent, 0, byteContent.Length);
                cStream.FlushFinalBlock();
    
                byte[] result = ms.ToArray();
                return EadUtil.Output(result, method);
            }
        }
    
        /// <summary>
        /// AES解密
        /// 密码:默认
        /// 偏移量:默认
        /// 模式:CBC
        /// 填充:PKCS7
        /// 编码:UTF8
        /// </summary>
        /// <param name="ciphertext">密文</param>
        /// <returns>返回明文</returns>
        public static string Decrypt(string ciphertext)
        {
            return Decrypt(ciphertext, _Key, _Vector);
        }
    
        /// <summary>
        /// AES解密
        /// 密码:默认
        /// 偏移量:默认
        /// 模式:CBC
        /// 填充:PKCS7
        /// 编码:UTF8
        /// </summary>
        /// <param name="ciphertext">密文</param>
        /// <returns>返回明文</returns>
        public static string Decrypt(string ciphertext, OutputMethod method)
        {
            return Decrypt(ciphertext, _Key, _Vector, method);
        }
    
        /// <summary>
        /// AES解密
        /// 密码:自定义
        /// 偏移量:自定义
        /// 模式:CBC
        /// 填充:PKCS7
        /// 编码:UTF8
        /// </summary>
        /// <param name="ciphertext">密文</param>
        /// <param name="key">密码,16、24、32位,不含中文</param>
        /// <param name="iv">偏移量,16位,不含中文</param>
        /// <param name="cipher">加密模式</param>
        /// <param name="padding">填充</param>
        /// <returns></returns>
        public static string Decrypt(string ciphertext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            if (String.IsNullOrEmpty(ciphertext))
            {
                throw new ArgumentNullException("密文不能为空");
            }
    
            byte[] buffer = EadUtil.Input(ciphertext, method);
    
            Encoding encoding = Encoding.UTF8;
            byte[] byteKey = encoding.GetBytes(key);
            byte[] byteIV = encoding.GetBytes(iv);
    
            Rijndael aes = Rijndael.Create();
            aes.Key = byteKey;
            aes.IV = byteIV;
            aes.Mode = cipher;
            aes.Padding = padding;
    
            using (MemoryStream ms = new MemoryStream())
            {
                CryptoStream cStream = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
                cStream.Write(buffer, 0, buffer.Length);
                cStream.FlushFinalBlock();
                ms.Close();
                return encoding.GetString(ms.ToArray());
            }
        }
    }

    点击查看 OutputMethod、EadUtil

  • 相关阅读:
    关于Design Complier/Library Compiler的跌坑(坑爹)记录
    博客暂时停更
    简单的Verilog测试模板结构
    存储器的设计/建模
    静态时序分析的三种分析模式(简述)
    Linux系统的基本使用
    Modelsim的使用——复杂的仿真
    Python-第三方库requests
    MySQL查询结果写入到文件总结
    MySQL创建函数报“ERROR 1418 ”错误,不能创建函数
  • 原文地址:https://www.cnblogs.com/weiweixiang/p/10102884.html
Copyright © 2011-2022 走看看