连接字符串的加密和解密

 

.//  这个方法是在网上找到的,自己看懂了!拿来大家分享一下!

   /// <summary>
            /// 对称加密算法类
            /// </summary>
      public class SymmetricMethod
      {
            private SymmetricAlgorithm mobjCryptoService;
            private string Key;
            /// <summary>
            /// 对称加密类的构造函数
            /// </summary>
            public SymmetricMethod()
            {
                mobjCryptoService = new RijndaelManaged();
                Key = "jcsmkjGuz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";

              // 个人认为这个串跟加密解密有关系,串不一样,加密出来的就不一样

                //Key = "sdasdasdasdasdwdfaeasdasasdasdas";
            }
                /// <summary>
                /// 获得密钥
                /// </summary>
            /// <returns>密钥</returns>
            private byte[] GetLegalKey()
            {
                string sTemp = Key;
                mobjCryptoService.GenerateKey();
                byte[] bytTemp = mobjCryptoService.Key;
                int KeyLength = bytTemp.Length;
                if (sTemp.Length > KeyLength)
                sTemp = sTemp.Substring(0, KeyLength);
                else if (sTemp.Length < KeyLength)
                sTemp = sTemp.PadRight(KeyLength, ' ');
                return ASCIIEncoding.ASCII.GetBytes(sTemp);
            }
            /// <summary>
            /// 获得初始向量IV
            /// </summary>
            /// <returns>初试向量IV</returns>
            private byte[] GetLegalIV()
            {
                string sTemp = "jcsmkjE4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";

            // 个人认为这个串跟加密解密有关系,串不一样,加密出来的就不一样
                //string sTemp = "lkdjaidknsdjhiuesndkak";
                mobjCryptoService.GenerateIV();
                byte[] bytTemp = mobjCryptoService.IV;
                int IVLength = bytTemp.Length;
                if (sTemp.Length > IVLength)
                sTemp = sTemp.Substring(0, IVLength);
                else if (sTemp.Length < IVLength)
                sTemp = sTemp.PadRight(IVLength, ' ');
                return ASCIIEncoding.ASCII.GetBytes(sTemp);
            }
            /// <summary>
            /// 加密方法
            /// </summary>
            /// <param name="Source">待加密的串</param>
            /// <returns>经过加密的串</returns>
            public string Encrypto(string Source)
            {
                byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
                MemoryStream ms = new MemoryStream();
                mobjCryptoService.Key = GetLegalKey();
                mobjCryptoService.IV = GetLegalIV();
                ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
                CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
                cs.Write(bytIn, 0, bytIn.Length);
                cs.FlushFinalBlock();
                ms.Close();
                byte[] bytOut = ms.ToArray();
                return Convert.ToBase64String(bytOut);
            }
            /// <summary>
            /// 解密方法
            /// </summary>
            /// <param name="Source">待解密的串</param>
            /// <returns>经过解密的串</returns>
            public string Decrypto(string Source)
            {
                byte[] bytIn = Convert.FromBase64String(Source);
                MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
                mobjCryptoService.Key = GetLegalKey();
                mobjCryptoService.IV = GetLegalIV();
                ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
                CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
                StreamReader sr = new StreamReader(cs);
                return sr.ReadToEnd();
            }

          /// <summary>
          /// 获得解密后的连接字符串
          /// </summary>
          /// <returns></returns>
            public string SqlConnectionstring()
            {
                //Read the configuration Keys and return connectionstring.
                string dataservername=ConfigurationSettings.AppSettings["data source"];
                string databasename=ConfigurationSettings.AppSettings["initial catalog"];
                string userid=ConfigurationSettings.AppSettings["user id"];
                string password=ConfigurationSettings.AppSettings["password"];
                string integratedsecurity=ConfigurationSettings.AppSettings["integrated security"];
                //string persistsecurityinfo=ConfigurationSettings.AppSettings["persist security info"];
                string connectionString;
                connectionString = "data source=" + Decrypto(dataservername);
                connectionString += ";initial catalog=" + Decrypto(databasename);
                //connectionString += ";persist security info="+persistsecurityinfo;
                connectionString += ";user id=" + Decrypto(userid);
                connectionString += ";password=" + Decrypto(password);
                return connectionString;
            }

 

 

----------------------------------------------------------------------------------------------------- 以下作为辅助说明

..NET Framework 类库--- SymmetricAlgorithm 类 
    程序集:mscorlib(在 mscorlib.dll 中)
-------------------------------------------------------
继承层次结构
- System.Object
----- System.Security.Cryptography.SymmetricAlgorithm
--------- System.Security.Cryptography.DES
--------- System.Security.Cryptography.RC2
--------- System.Security.Cryptography.Rijndael
--------- System.Security.Cryptography.TripleDES

.--------------------------------------------------
从 SymmetricAlgorithm 类继承时,必须重写以下成员:
CreateDecryptor、CreateEncryptor、GenerateIV 和 GenerateKey

 

SymmetricAlgorithm.Key 属性 
----------------------------------------------
获取或设置对称算法的机密密钥。
public virtual byte[] Key { get; set; }
异常类型 :ArgumentNullException
条件:试图将密钥设置为 空引用。

机密密钥既用于加密,也用于解密。为了保证对称算法成功,必须只有发送方和接收方知道密钥。有效密钥大小由对称算法的具体实现指定,
并且在 LegalKeySizes 属性中列出。
如果此属性在使用时为 空引用,则调用 GenerateKey 方法以创建新的随机值。
 
SymmetricAlgorithm.IV 属性
----------------------------------------------
获取或设置对称算法的初始化向量 (IV)。
public virtual byte[] IV { get; set; }
异常类型1:ArgumentNullException
条件: 试图将初始化向量设置为 空引用。
 
异常类型2 :CryptographicException
条件: 试图将初始化向量设置为无效大小。
  每当您创建其中一个 SymmetricAlgorithm 类的新实例时,或者当您手动调用 GenerateIV 方法时,IV 属性均自动设置为新的随机值。IV 属性的
大小必须与 BlockSize 属性的大小相同。
从 SymmetricAlgorithm 类派生的类使用一种称为密码块链接 (CBC) 的链接模式,该链接模式需要密钥和初始化向量才能执行数据的加密转换。
若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。
对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为同一个密码文本输出块。如果您的纯文本流中有重复块,则
您的密码文本流中也会有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以利用该信息来解密已知的密码文本块
,并有可能重新获得您的密钥。为了防止这个问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的纯文本块的输
出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需要初始化向量来加密数据的第一个块。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值