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);
            }
        }

 





  第一次發貼,不喜勿噴!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM