c# AES加密解密


c# AES加密解密

   本人因為近期對接java的項目,遇到一些問題,明明java那邊是標准的AES加密,但是就是c#解密不了,網上找了好幾個在線解密也解密不了,只知道一個可以在線解密成功的,可惜沒有代碼例子提供。

   最后讓他提供java代碼例子,調式才知道原來C#中的byte和Java中的byte取值范圍不一樣,Java中的取值范圍為-128~127,C#中取值范圍為0~255,所以加密的時候,我把加密出來的結果轉成十六進制,結果就好了

   

                    //16位密鑰
                    string key = "abcdefghijklmnop";
                    string json = "{\"userName\":\"wind追光者\",\"age\":\"18\"}";
                    //AES加密
                    string sign = json.AESEncrypt(key);
                    //AES解密
                    string jsonStr = sign.AESDecrypt(key);

    AESHelper

    public static class Aes128Helper
    {
        /// <summary>
        ///  AES 加密
        /// </summary>
        /// <param name="str">明文(待加密)</param>
        /// <returns></returns>
        public static string AESEncrypt(this string str,string aesSecretKey)
        {
            try
            {
                if (string.IsNullOrEmpty(str)) return null;
                byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
                byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey);


                RijndaelManaged rm = new RijndaelManaged
                {
                    Key = keyArray,
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7
                };

                ICryptoTransform cTransform = rm.CreateEncryptor();
                Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
                string strs = "";
                for (var x = 0; x < resultArray.Length; x++)
                {
                    var i = Convert.ToString(resultArray[x], 16);
                    strs += i.PadLeft(2, '0');
                }
                return strs;
            }
            catch (Exception ex)
            {
                return "";
            }

        }
        /// <summary>
        ///  AES 解密
        /// </summary>
        /// <param name="str">密文(待解密)</param>
        /// <returns></returns>
        public static string AESDecrypt(this string str,string aesSecretKey)
        {
            try
            {
                if (string.IsNullOrEmpty(str)) return null;
                byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey);
                byte[] toEncryptArray = new byte[str.Length / 2];
                for (var x = 0; x < toEncryptArray.Length; x++)
                {
                    var i = Convert.ToInt32(str.Substring(x * 2, 2), 16);
                    toEncryptArray[x] = (byte)i;
                }

                RijndaelManaged rDel = new RijndaelManaged();
                rDel.Key = keyArray;
                rDel.Mode = CipherMode.ECB;
                rDel.Padding = PaddingMode.PKCS7;

                ICryptoTransform cTransform = rDel.CreateDecryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

                return UTF8Encoding.UTF8.GetString(resultArray);
            }
            catch (Exception ex)
            {
                return "";
            }
        }
    }

  此處AES並不是標准AES加密,把轉十六進制去掉才是AES,本文只是記錄踩坑!!!

   


免責聲明!

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



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