zoukankan      html  css  js  c++  java
  • EncryptionHelper

    public static class EncryptionHelper
        {
            #region const
            /// <summary>
            /// 默认使用的适合于DES,RC2算法的Key
            /// </summary>
            private const string m_ShortDefaultKey = "Nesc";
            /// <summary>
            /// 默认使用的TRIPLEDES,RIJNDAEL算法的Key
            /// </summary>
            private const string m_LongDefaultKey = "Nesc.Oversea";
            /// <summary>
            /// 默认使用的适合于DES,RC2,TRIPLEDES算法的InitVector
            /// </summary>
            private const string m_ShortDefaultIV = "2001";
    
            /// <summary>
            /// 默认使用的适合于RIJNDAEL算法的InitVector
            /// </summary>
            private const string m_LongDefaultIV = "Oversea3";
    
            #endregion 
            private static byte[] m_Key = null;
    
            
    
            private static byte[] m_initVec = null;
    
            #region properties
            /// <summary>
            /// 使用的加密明文密码
            /// </summary>
            public static string Key
            {
                get
                {
                    string result = string.Empty;
                    if (m_Key != null)
                    {
                        result = Encoding.Unicode.GetString(m_Key);
                    }
                    return result;
                }
    
            }
            /// <summary>
            /// 使用加密的起始偏移量
            /// </summary>
            public static string InitVector
            {
                get 
                {
                    string result = string.Empty;
                    if (m_initVec != null)
                    {
                        result = Encoding.Unicode.GetString(m_initVec);
                    }
                    return result; 
                }
    
            }
            #endregion 
    
          /// <summary>
          /// 接受用户明文密码,本次加密使用的算法,完成对指定字符串的加密
          /// <example><![CDATA[string result = EncryptionHelper.Encrypt("1234", EncryptionAlgorithm.Rc2, "5678", text);]]></example>
          /// <remarks>各个算法对明文密码和初始化偏移量的要求不一样
          /// DES和RC2:明文密码长度和初始化偏移量长度 必须是4个字符;
          /// Rijndael:明文密码长度可以是12,16个字符,初始化偏移量为8个字符;
          /// TripleDes:明文密码长度可以为8个和12个字符,初始化偏移量为4个字符;
          /// 注意:如果提供的明文密码和偏移量不符合算法的标准,将使用随机密码,使用者在加密后通过提供的Key和InitVector属性获得加密时使用的明文密码和偏移量
          /// </remarks>
          /// </summary>
          /// <param name="plainText">使用的加密明文密码</param>
          /// <param name="algorithm">加密算法枚举对象</param>
          /// <param name="userInitialVector">使用的加密起始偏移量</param>
          /// <param name="encryptionText">需要加密的字符</param>
          /// <returns></returns>
            public static string Encrypt(string plainText, EncryptionAlgorithm algorithm, string userInitialVector, string encryptionText)
            {
                string result = string.Empty;
               
                if (encryptionText.Length > 0)
                {
                    SetKey(algorithm, plainText);
                    SetInitialVector(algorithm, userInitialVector);
                    EncryptTransform transform = new EncryptTransform(m_Key,m_initVec);
                    byte[] bytes = Encoding.Unicode.GetBytes(encryptionText);
                    byte[] inArray = transform.Encrypt(algorithm, bytes);
                    if (inArray.Length > 0)
                    {
                        result = Convert.ToBase64String(inArray);
                    }
                    m_Key = transform.Key;
                    m_initVec = transform.InitVec;
                    
                }
                return result;
    
            }
    
            /// <summary>
            /// 指定需要加密的字符串使用默认的明文密码和算法(DES)进行加密
            /// </summary>
            /// <param name="encryptionText"></param>
            /// <returns></returns>
            public static string Encrypt(string encryptionText)
            {
                string result = string.Empty;
                result = Encrypt(m_ShortDefaultKey, EncryptionAlgorithm.Des, m_ShortDefaultIV, encryptionText);
                return result;
            }
            /// <summary>
            /// 指定需要加密的字符串和算法使用默认的明文密码进行加密
            /// </summary>
            /// <param name="algorithm"></param>
            /// <param name="encryptionText"></param>
            /// <returns></returns>
            public static string Encrypt(EncryptionAlgorithm algorithm, string encryptionText)
            {
                string result = string.Empty;
                string key = GetDefaultKey(algorithm);
                string iv = GetDefaultIV(algorithm);
                result = Encrypt(key, algorithm, iv, encryptionText);
                return result;
            }
    
    
    
            /// <summary>
            /// 接受用户明文密码,使用默认的加密算法完成对指定字符串的加密
            /// <remarks>默认为DES算法进行加密</remarks>
            ///  <example><![CDATA[string result = EncryptionHelper.Encrypt("1234", "5678", text);]]></example>
            /// </summary>
            /// <param name="plainText">使用的加密明文密码</param>
            /// <param name="userInitialVector">使用的加密起始偏移量</param>
            /// <param name="encryptionText">需要加密的字符串</param>
            /// <returns>加密后的字符串</returns>
            public static string Encrypt(string plainText, string userInitialVector, string encryptionText)
            {
                string result = string.Empty;
                result = Encrypt(plainText, EncryptionAlgorithm.Des, userInitialVector, encryptionText);
                return result;
            }
    
            /// <summary>
            ///  接受用户明文密码,本次使用的解密算法,完成对指定字符串的解密;
            ///  <remarks>指定的解密算法必须和字符串使用加密的算法一致
            /// 各个算法对明文密码和初始化偏移量的要求不一样
            /// DES和RC2:明文密码长度和初始化偏移量长度 必须是4个字符;
            /// Rijndael:明文密码长度可以是12,16个字符,初始化偏移量为8个字符;
            /// TripleDes:明文密码长度可以为8个和12个字符,初始化偏移量为4个字符;
            /// </summary>
            /// <param name="plainText">加密明文密码</param>
            /// <param name="algorithm">使用的加密算法</param>
            /// <param name="userInitialVector">加密时使用的起始偏移量</param>
            /// <param name="encryptionText">加密后的字符串</param>
            /// <returns></returns>
            public static string Decrypt(string plainText, EncryptionAlgorithm algorithm, string userInitialVector, string encryptionText)
            {
                string result = string.Empty;
                SetKey(algorithm, plainText);
                SetInitialVector(algorithm, userInitialVector);
                EncryptTransform transform = new EncryptTransform(m_Key, m_initVec);
                byte[] bytesData = Convert.FromBase64String(encryptionText);
                byte[] bytes = null;
                try
                {
                    bytes = transform.Decrypt(algorithm, bytesData);
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                if (bytes.Length > 0)
                {
                    result = Encoding.Unicode.GetString(bytes);
                }
                m_Key = transform.Key;
                m_initVec = transform.InitVec;
                return result;
    
            }
    
           /// <summary>
            /// 接受用户明文密码,使用默认解密算法完成对指定字符串的解密
           /// </summary>
           /// <param name="plainText">加密时使用的明文密码</param>
           /// <param name="userInitialVector">加密时使用的起始偏移量</param>
           /// <param name="encryptionText">加密后的字符串</param>
           /// <returns></returns>
            public static string Decrypt(string plainText, string userInitialVector, string encryptionText)
            {
                string result = string.Empty;
                result=Decrypt(plainText, EncryptionAlgorithm.Des,userInitialVector,encryptionText);
                return result;
    
            }
    
            /// <summary>
            /// 使用默认的算法(DES)和默认的明文密码进行解密
            /// </summary>
            /// <param name="encryptionText"></param>
            /// <returns></returns>
            public static string Decrypt(string encryptionText)
            {
                string result = string.Empty;
                result = Decrypt(m_ShortDefaultKey, EncryptionAlgorithm.Des, m_ShortDefaultIV, encryptionText);
                return result;
    
            }
            /// <summary>
            /// 指定加密时使用的算法,使用默认的明文密码进行解密
            /// </summary>
            /// <param name="algorithm"></param>
            /// <param name="encryptionText"></param>
            /// <returns></returns>
            public static string Decrypt(EncryptionAlgorithm algorithm,string encryptionText)
            {
                string result = string.Empty;
                string key = GetDefaultKey(algorithm);
                string iv = GetDefaultIV(algorithm);
                result = Decrypt(key, algorithm, iv, encryptionText);
                return result;
    
            }
    
            /// <summary>
            /// 根据算法获得默认的Key
            /// </summary>
            /// <param name="algorithm"></param>
            /// <returns></returns>
            private static string GetDefaultKey(EncryptionAlgorithm algorithm)
            {
                string result = m_ShortDefaultKey;
                switch (algorithm)
                {
                    case EncryptionAlgorithm.Rijndael:
                        {
                            result = m_LongDefaultKey;
                            break;
                        }
                    case EncryptionAlgorithm.TripleDes:
                        {
                            result = m_LongDefaultKey;
                            break;
                        }
                }
                return result;
            }
            /// <summary>
            /// 根据算法获得默认的IV
            /// </summary>
            /// <param name="algorithm"></param>
            /// <returns></returns>
            private static string GetDefaultIV(EncryptionAlgorithm algorithm)
            {
                string result = m_ShortDefaultIV;
                switch (algorithm)
                {
                    case EncryptionAlgorithm.Rijndael:
                        {
                            result = m_LongDefaultIV;
                            break;
                        }
                }
                return result;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="algorithm"></param>
            /// <param name="initialVector"></param>
            /// <returns></returns>
            private static void SetInitialVector(EncryptionAlgorithm algorithm, string initialVector)
            {
                if (null != initialVector)
                {
                    byte[] bytes = Encoding.Unicode.GetBytes(initialVector);
                    switch (algorithm)
                    {
                        case EncryptionAlgorithm.Des:
                            {
                                if ( bytes.Length == 8)
                                {
                                    m_initVec = bytes;
    
                                }
                                break;
                            }
    
                        case EncryptionAlgorithm.Rc2:
                            {
                                if ( bytes.Length == 8)
                                {
                                    m_initVec = bytes;
    
                                }
                                break;
                            }
                        case EncryptionAlgorithm.Rijndael:
                            {
                                if ( bytes.Length ==16)
                                {
                                    m_initVec = bytes;
    
                                }
                                break;
                            }
                        case EncryptionAlgorithm.TripleDes:
                            {
                                if (bytes.Length == 8)
                                {
                                    m_initVec = bytes;
    
                                }
                                break;
                            }
                    }
                }
            }
    
            private static void SetKey(EncryptionAlgorithm algorithm, string key)
            {
                if (null != key)
                {
                    byte[] keyByte = Encoding.Unicode.GetBytes(key);
                    switch (algorithm)
                    {
                        case EncryptionAlgorithm.Des:
                            {
                                if (keyByte.Length== 8)
                                {
                                    m_Key = keyByte;
                                }
                                break;
                            }
    
                        case EncryptionAlgorithm.Rc2:
                            {
                                if (keyByte.Length == 8)
                                {
                                    m_Key = keyByte;
                                }
                                break;
                            }
                        case EncryptionAlgorithm.Rijndael:
                            {
                                if (keyByte.Length==24 || (keyByte.Length == 32))
                                {
                                    m_Key = keyByte;
                                }
                                break;
                            }
                        case EncryptionAlgorithm.TripleDes:
                            {
                                if (keyByte.Length ==16 ||(keyByte.Length == 24))
                                {
                                    m_Key = keyByte;
                                }
                                break;
                            }
                    }
                }
            }
    
        }
  • 相关阅读:
    ORA-12801/ORA-12853: insufficient memory for PX buffers: current 274880K, max needed 19722240K/ORA-04031解决方法
    关于oracle result_cache
    oracle insert、append、parallel、随后查询的redo与磁盘读写
    关于ashrpt中行源的CPU + Wait for CPU事件深入解读
    resmgr:cpu quantum 等待事件 top 1
    ORA-00600: internal error code, arguments: [kcblin_3], [103], [253952], [8192], [32769], [312], [640], [], [], [], [], []解决方法
    Oracle之with as和update用法
    oracle查询buffer cache中undo大小
    oracle group by placement可能导致错误结果的bug
    maven maven-war-plugin 解决java war项目间的依赖(两个war都可独立部署运行,maven 3.2.x亲测)
  • 原文地址:https://www.cnblogs.com/Wolfmanlq/p/4183435.html
Copyright © 2011-2022 走看看