• C# AES的128位、192位、256位加密


    C# AES的128位、192位、256位加密

     

      AES加密原理,这里就不解释了,自行百度。这里主要细说AES的CBC加密模式下的128位、192位、256位加密区别,参考 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB) 。

           这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位,32位密钥=256位。

      废话不多说,直接上图。

      16位密钥对应128位加密

      

           

      

      24位密钥对应192位加密

      

          

         

         32位密钥对应256位加密

       

         

         

       其中,向量都必须是16位。

       

       最后贴出封装的加解密代码:

        

        
    复制代码
         //AES加密
         public static string AesEncrypt(string value, string key, string iv = "")
            {
                if (string.IsNullOrEmpty(value)) return string.Empty;
                if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
                if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
                if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
                if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
                if (!string.IsNullOrEmpty(iv))
                {
                    if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
                }
    
                var _keyByte = Encoding.UTF8.GetBytes(key);
                var _valueByte = Encoding.UTF8.GetBytes(value);
                using (var aes = new RijndaelManaged())
                {
                    aes.IV = !string.IsNullOrEmpty(iv) ? Encoding.UTF8.GetBytes(iv) : Encoding.UTF8.GetBytes(key.Substring(0, 16));
                    aes.Key = _keyByte;
                    aes.Mode = CipherMode.CBC;
                    aes.Padding = PaddingMode.PKCS7;
                    var cryptoTransform = aes.CreateEncryptor();
                    var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
                    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
                }
            }
        
         //AES解密
         public static string AesDecrypt(string value, string key, string iv = "")
            {
                if (string.IsNullOrEmpty(value)) return string.Empty;
                if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
                if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
                if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
                if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
                if (!string.IsNullOrEmpty(iv))
                {
                    if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
                }
    
                var _keyByte = Encoding.UTF8.GetBytes(key);
                var _valueByte = Convert.FromBase64String(value);
                using (var aes = new RijndaelManaged())
                {
                    aes.IV = !string.IsNullOrEmpty(iv) ? Encoding.UTF8.GetBytes(iv) : Encoding.UTF8.GetBytes(key.Substring(0, 16));
                    aes.Key = _keyByte;
                    aes.Mode = CipherMode.CBC;
                    aes.Padding = PaddingMode.PKCS7;
                    var cryptoTransform = aes.CreateDecryptor();
                    var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
                    return Encoding.UTF8.GetString(resultArray);
                }
            }
    复制代码
    
    
  • 相关阅读:
    Android开发(二十一)——自动更新
    Android开发(十九)——ViewFlipper中的onClick事件和onFling事件冲突
    Android开发(十八)——头部、中部、底部布局技巧
    Android开发(十七)——关闭中间activity
    Android开发(十六)——Android listview onItemClick事件失效的原因
    Android开发(十五)——ListView中Items的间距margin
    Android开发(十四)——SimpleAdapter与自定义控件
    [ MongoDB ] 3.X权限认证控制
    批量修改主机密码并发送到邮箱
    [ ceph ] CEPH 部署完整版(CentOS 7 + luminous)
  • 原文地址:https://www.cnblogs.com/Jeely/p/11724297.html
Copyright © 2020-2023  润新知