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来更加灵活的进行用户身份验证及角色处理。