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