项目的加密解密(1)
public static class DESUtil { /// <summary> /// DES加密 /// </summary> /// <param name="data">加密数据</param> /// <param name="key">8位字符的密钥字符串</param> /// <param name="iv">8位字符的初始化向量字符串</param> /// <returns></returns> public static string DESEncrypt(string data, string key, string iv="12345678") { //把字符串放到byte数组中 DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.Default.GetBytes(data); des.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8)); //建立加密对象的密钥和偏移量 des.IV = Encoding.ASCII.GetBytes(iv.Substring(0, 8)); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法 MemoryStream ms = new MemoryStream(); //使得输入密码必须输入英文文本 try { CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); } catch (Exception e) { Console.WriteLine(e.ToString()); } return Convert.ToBase64String(ms.ToArray()); } /// <summary> /// DES解密 /// </summary> /// <param name="data">解密数据</param> /// <param name="key">8位字符的密钥字符串(需要和加密时相同)</param> /// <param name="iv">8位字符的初始化向量字符串(需要和加密时相同)</param> /// <returns></returns> public static string DESDecrypt(string pToDecrypt, string sKey, string sIV = "12345678") { //byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key); //byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv); //byte[] byEnc; //try //{ // byEnc = Convert.FromBase64String(data); //} //catch //{ // return null; //} //DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); //MemoryStream ms = new MemoryStream(byEnc); //CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read); //StreamReader sr = new StreamReader(cst); //return sr.ReadToEnd(); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Convert.FromBase64String(pToDecrypt); des.Key = Encoding.ASCII.GetBytes(sKey.Substring(0, 8)); //建立加密对象的密钥和偏移量 des.IV = Encoding.ASCII.GetBytes(sIV.Substring(0, 8)); string decrypt = ""; using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { //cStream.Write(byteArray, 0, byteArray.Length); //cStream.FlushFinalBlock(); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(ms.ToArray()); } } //MemoryStream ms = new MemoryStream(); //CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); //cs.Write(inputByteArray, 0, inputByteArray.Length); //cs.FlushFinalBlock(); //cs.Close(); //return System.Text.Encoding.Default.GetString(ms.ToArray()); return decrypt; } }
做项目时,经常会遇到一个尾款的问题。
所以软件的到期验证十分必要,到期验证和加密解密十分相关。
这个是我个人的到期验证的一个思路做法。
首先获取一个唯一码。可以是机器码(CPU码,硬盘码等等),也可以是uuid。然后使用个人密码用函数DESEncrypt把到期日期加密。
需要使用时,再把这个到期时间解密出来。
这个方法算是比较简单的一个方法。好处是需要设置到期时间时,直接把加密后的数据给客户,让他直接注册就可以了。
不过,这个方法有一个很通常的问题。就是如果更改系统时间,这个方法就不起作用了。