韩言福地

只有想不到的,没有办不到的。 - HY Auspicious Place

« 不创新永远只能在死胡同.net c# 进制转换 2进制、8进制、10进制、16进制 »

.net 加密问题


DES加密要事先提供一个密码:Key及一个初始向量:IV(Initial Vector)来进行初始化,而这个Key及IV都必须是8个字节的数据。
这里简单的实现了一个加密与解密:
using System;
using System.IO;
using System.Web;
using System.Security.Cryptography;
using System.Globalization;
using System.Text;
using System.ComponentModel;
         ///   <summary>
        
///  DES encrypt.
        
///   </summary>
        
///   <param name="i_key"></param>
        
///   <param name="i_IV"></param>
        
///   <param name="i_data"></param>
        
///   <returns></returns>

         public   static   string  Encrypt( string  i_key, string  i_IV, string  i_data)
        
{
            
byte [] m_keys     =  Encoding.ASCII.GetBytes(i_key);
            
byte [] m_IVs     =  Encoding.ASCII.GetBytes(i_IV);
            
byte [] m_data     =  Encoding.ASCII.GetBytes(i_data);
            DESCryptoServiceProvider m_DES    
=   new  DESCryptoServiceProvider();
            ICryptoTransform m_encrypt        
=  m_DES.CreateEncryptor(m_keys,m_IVs);
            
byte [] m_result     =  m_encrypt.TransformFinalBlock(m_data, 0 ,m_data.Length);
            m_encrypt.Dispose();
            m_DES.Clear();
            
return  BitConverter.ToString(m_result);
        }


        
///   <summary>
        
///  DES descrypt.
        
///   </summary>
        
///   <param name="i_key"> Keys </param>
        
///   <param name="i_IV"> initial vector </param>
        
///   <param name="i_data"> Data </param>
        
///   <returns></returns>

         public   static   string  Decrypt( string  i_key, string  i_IV, string  i_data)
        
{
            
string [] m_datas     =  i_data.Split( ' - ' );
            
byte [] m_values         =   new   byte [m_datas.Length];
            Int32Converter m_i32Converter    
=   new  Int32Converter();
            
for ( int  i = 0 ;i < m_datas.Length;i ++ )
            
{
                m_values[i]        
=  Convert.ToByte(m_i32Converter.ConvertFromInvariantString( " 0x " + m_datas[i]).ToString());
            }

            
byte [] m_keys     =  Encoding.ASCII.GetBytes(i_key);
            
byte [] m_IVs     =  Encoding.ASCII.GetBytes(i_IV);
            
byte [] m_data     =  Encoding.ASCII.GetBytes(i_data);
            DESCryptoServiceProvider m_DES    
=   new  DESCryptoServiceProvider();
            ICryptoTransform m_encrypt        
=  m_DES.CreateDecryptor(m_keys,m_IVs);
            
byte [] m_result     =  m_encrypt.TransformFinalBlock(m_values, 0 ,m_values.Length);
            
return  Encoding.ASCII.GetString(m_result);            
        }

注意:1、这里的i_key及i_IV都必须是8个字节的,也就是说必须是ASCII的8个字符串,否则在加密及解密中会抛出异常!有了这个加密与解密后,我们就可以对自己定义的Cookies进行加密,然保存在用户的机器上了。
2、这里的Key与IV不仅是初始化算法所必须的,也是解密时所必须的。

六、加密数据溢出问题:
上面已经强调了很多次,KEY及IV都必须是8个字节的,否则出现错误。这对于程序员来说很好理解,但对于用户来说,可就不是什么好事了。如果用少于或者多于8个字节的KEY或者IV来调用加密或者解密函数,都将出现错误。这个可以由程序员来决定,或者将KEY及IV事先就选择好,也就不会有问题了。注意加密与解密所选择的Encoding字符集,不同的字符集得到的结果是不样的。

七、附加MD5密码函数:

         ///   <summary>
        
///  
        
///   </summary>
        
///   <param name="str_inString"></param>
        
///   <returns></returns>

         static   public   string  GetMD5( string  i_data)
        
{
            
byte [] m_datas     =  Encoding.ASCII.GetBytes(i_data);
            MD5CryptoServiceProvider m_MD5 
=   new  MD5CryptoServiceProvider();
            
byte [] m_value     =  m_MD5.ComputeHash(m_datas);
            
return  BitConverter.ToString(m_value);
        }

总结:其实.net下的表单验证就是一个Cookies,我们不仅可以自己定义验证票据,而且还可以自己模拟验证模式来自己添加Cookies来更加灵活的进行用户身份验证及角色处理。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright 2007-2010 www.yinrg.com(HY Auspicious Place) . 湘ICP备06007796号.