zoukankan      html  css  js  c++  java
  • C# 和JAVA AES加密之间的互相兼容,C#版

    #region AES
    
    
    
            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="content"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            protected virtual string EcryptHexString2String(string content, string password)
            {
                var ecrypt = EcryptAES(content, password);
                var result = Bytes2HexString(ecrypt);
                return result;
            }
            /// <summary>
            /// 得到加密之后的16位进制的字符串
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            protected virtual string Bytes2HexString(string str)
            {
                var bytes = Convert.FromBase64String(str);
                var result = "";
                foreach (var i in bytes)
                {
                    result = string.IsNullOrWhiteSpace(result) ? $"{i.ToString("X2")}" : $"{result}{i.ToString("X2")}";
                }
    
                return result;
            }
    
            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="content"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            protected virtual string EcryptAES(string content, string password)
            {
                RijndaelManaged rijndaelCipher = new RijndaelManaged
                {
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7,
                    KeySize = 128,
                    BlockSize = 128
                };
                byte[] pwdBytes = getKey(password);
                byte[] keyBytes = new byte[16];
                int len = pwdBytes.Length;
                if (len > keyBytes.Length)
                    len = keyBytes.Length;
                Array.Copy(pwdBytes, keyBytes, len);
                rijndaelCipher.Key = keyBytes;
                ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
                byte[] plainText = Encoding.UTF8.GetBytes(content);
                byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
                return Convert.ToBase64String(cipherBytes);
            }
            /// <summary>
            /// 解密
            /// </summary>
            /// <param name="content"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            protected virtual string DecryptHexString2String(string content, string password)
            {
                if (string.IsNullOrEmpty(content))
                    return "";
                var bytes = HexString2Bytes(content);
                var result = DecryptAes(Convert.ToBase64String(bytes), password);
                return result;
            }
            /// <summary>
            /// 解密
            /// </summary>
            /// <param name="input"></param>
            /// <param name="key"></param>
            /// <returns></returns>
            protected virtual string DecryptAes(string input, string key)
            {
                var encryptedBytes = Convert.FromBase64String(input);
                byte[] pwdBytes = getKey(key);
                byte[] keyBytes = new byte[16];
                int len = pwdBytes.Length;
                if (len > keyBytes.Length) len = keyBytes.Length;
                Array.Copy(pwdBytes, keyBytes, len);
                RijndaelManaged rijndael = new RijndaelManaged
                {
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7,
                    KeySize = 128,
                    BlockSize = 128,
                    Key = keyBytes
                };
                ICryptoTransform transform = rijndael.CreateDecryptor();
                byte[] plainText = transform.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
                return Encoding.UTF8.GetString(plainText);
            }
            /// <summary>
            /// 得到密钥
            /// </summary>
            /// <param name="secret"></param>
            /// <returns></returns>
            public virtual byte[] getKey(string password)
            {
                try
                {
                    byte[] key = Encoding.UTF8.GetBytes(password);
                    using (var st = new SHA1CryptoServiceProvider())
                    {
                        using (var nd = new SHA1CryptoServiceProvider())
                        {
                            var rd = nd.ComputeHash(st.ComputeHash(key));
                            byte[] keyArray = rd.Take(16).ToArray();
                            return keyArray;
                        }
                    }
                }
                catch (Exception)
                {
    
                }
                throw new Exception("初始化密钥出现异常");
            }
            /// <summary>
            /// 16进制转换2进制
            /// </summary>
            /// <param name=""></param>
            /// <returns></returns>
            protected virtual byte[] HexString2Bytes(string content)
            {
                if (string.IsNullOrEmpty(content))
                    return null;
    
                var len = content.Length / 2;
                var result = new byte[len];
                for (var i = 0; i < len; i++)
                {
                    result[i] = Convert.ToByte(content.Substring(i * 2, 2), 16);
                }
                return result;
            }
    
            #endregion
    View Code

    我的业务中加了个把加密后的内容进行16进制转换,就不改了吧。

    参考地址:https://blog.csdn.net/qiandeqiande/article/details/102808581?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.nonecase

  • 相关阅读:
    iOS开发JSON文件解析数据成Model的过程简单介绍
    ios 开发中 --做登陆注册时编译出现的错误和解决方法
    iOS 开发 SMSSDK-免费短信获取的实现方法
    IOS 设计 面试题及答案
    Cycle (KMP + hash)
    ATM Mechine (概率DP)
    Bubble Sort (找规律)
    The All-purpose Zero (最长公共子序列)
    Substring (后缀数组 + 计数)
    Lucky 7 (容斥原理 + 中国剩余定理)
  • 原文地址:https://www.cnblogs.com/CnnBlog/p/13178189.html
Copyright © 2011-2022 走看看