zoukankan      html  css  js  c++  java
  • StringHelpers

    public class StringHelpers
    {
        public const char QUERY_STRING_DELIMITER = '&';
    
        private static RijndaelManaged _cryptoProvider;
        //128 bit encyption: DO NOT CHANGE
        private static readonly byte[] Key = { 18, 19, 8, 24, 8, 22, 2, 25, 17, 5, 11, 9, 13, 15, 06, 9 };
        private static readonly byte[] IV = { 14, 2, 16, 7, 5, 9, 33, 23, 23, 47, 16, 12, 1, 32, 25, 9 };
        static StringHelpers()
        {
            _cryptoProvider = new RijndaelManaged();
            _cryptoProvider.Mode = CipherMode.CBC;
            _cryptoProvider.Padding = PaddingMode.PKCS7;
        }
    
        public static string Encrypt(string unencryptedString)
        {
            return Encrypt(unencryptedString, string.Empty);
        }
    
        public static string Encrypt(string unencryptedString, string myKey)
        {
    
            //byte[] bytIn = ASCIIEncoding.ASCII.GetBytes(unencryptedString);
            //如果內容有unicode的話,要用utf8編碼
            byte[] bytIn = UTF8Encoding.UTF8.GetBytes(unencryptedString);
            byte[] bytKey;
            if(string.IsNullOrEmpty(myKey)){
                bytKey = Key;
            }else{
                bytKey = ASCIIEncoding.ASCII.GetBytes(myKey);
                Array.Resize(ref bytKey, 16);
            }
            // Create a MemoryStream
            MemoryStream ms = new MemoryStream();
            // Create Crypto Stream that encrypts a stream
            CryptoStream cs = new CryptoStream(ms, _cryptoProvider.CreateEncryptor(bytKey, IV), CryptoStreamMode.Write);
            // Write content into MemoryStream
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            byte[] bytOut = ms.ToArray();
            //因為url不能吃+所以要轉成@@@
            return Convert.ToBase64String(bytOut).Replace("+", "@@@");
        }
    
        public static string Decrypt(string encryptedString)
        {
            return Decrypt(encryptedString, string.Empty);
        }
    
        public static string Decrypt(string encryptedString, string myKey)
        {
            if (encryptedString.Trim().Length != 0)
            {
                //如果有人改加密字串的話,解就會發生錯誤,所以錯誤就回傳空字串
                try
                {
                    // Convert from Base64 to binary 在解開前要先將@@@轉成+
                    byte[] bytIn = Convert.FromBase64String(encryptedString.Replace("@@@", "+"));
                    byte[] bytKey;
                    if(string.IsNullOrEmpty(myKey)){
                        bytKey = Key;
                    }else{
                        bytKey = ASCIIEncoding.ASCII.GetBytes(myKey);
                        Array.Resize(ref bytKey, 16);
                    }
                    // Create a MemoryStream
                    MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
                    // Create a CryptoStream that decrypts the data
                    CryptoStream cs = new CryptoStream(ms, _cryptoProvider.CreateDecryptor(bytKey, IV), CryptoStreamMode.Read);
    
                    // Read the Crypto Stream
                    StreamReader sr = new StreamReader(cs);
                    return sr.ReadToEnd();
                }
                catch
                {
                    return "";
                }
            }
            else
            {
                return "";
            }
        }
    
        public static NameValueCollection DecryptQueryString(string queryString)
        {
            return DecryptQueryString(queryString, string.Empty);
        }
    
        public static NameValueCollection DecryptQueryString(string queryString, string myKey)
        {
            if (queryString.Length != 0)
            {
                //Decode the string
                string decodedQueryString = HttpUtility.UrlDecode(queryString);
                //Decrypt the string
                string decryptedQueryString = StringHelpers.Decrypt(decodedQueryString, myKey );
                //Now split the string based on each parameter
                string[] actionQueryString = decryptedQueryString.Split(new char[] { QUERY_STRING_DELIMITER });
                NameValueCollection newQueryString = new NameValueCollection();
                //loop around for each name value pair.
                for (int index = 0; index < actionQueryString.Length; index++)
                {
                    string[] queryStringItem = actionQueryString[index].Split(new char[] { '=' });
                    if(queryStringItem.Length > 1)
                        newQueryString.Add(queryStringItem[0], queryStringItem[1]);
                }
                return newQueryString;
            }
            else
            {
                //No query string was passed in.
                return null;
            }
        }
    
        public static string EncryptQueryString(NameValueCollection queryString)
        {
            return EncryptQueryString(queryString, string.Empty);
        }
    
        public static string EncryptQueryString(NameValueCollection queryString, string myKey)
        {
            //create a string for each value in the query string passed in.
            string tempQueryString = "";
            for (int index = 0; index < queryString.Count; index++)
            {
                tempQueryString += queryString.GetKey(index) + "=" + queryString[index];
                if (index != queryString.Count - 1)
                {
                    tempQueryString += QUERY_STRING_DELIMITER;
                }
            }
            return EncryptQueryString(tempQueryString, myKey);
        }
    
        public static string EncryptQueryString(string queryString)
        {
            return EncryptQueryString(queryString, string.Empty);
        }
    
        public static string EncryptQueryString(string queryString, string myKey)
        {
            return "?" + HttpUtility.UrlEncode(StringHelpers.Encrypt(queryString, myKey));
        }
    }
  • 相关阅读:
    九月腾讯,创新工场,淘宝等公司最新面试三十题
    java静态变量和实例变量的区别
    海量数据处理:十道面试题与十个海量数据处理方法总结
    持有对象(看think in java)
    在myeclipse9.0中安装插件SVN(掌握通用安装插件的方法)
    java的垃圾回收机制(think in java学习总结):
    CSS控制文本自动换行
    jquery获得select option的值 和对select option的操作
    JS操作table!js table行数
    jquery ui datepicker 只能选今天以后的日期
  • 原文地址:https://www.cnblogs.com/siyunianhua/p/3861455.html
Copyright © 2011-2022 走看看