用机器码授权验证,如何加密比较好

pfworld 2013-08-06 05:31:16
因为用户计算机没有网络,因此根据机器码+授权时间生成注册码,如果用户说换计算机了,如何保证软件权益?

使用机器码+授权时间使用MD5机密,太长了,有没有好点的加密方法(生成注册码短一点)。


//获得网卡序列号----MAc地址
public string GetMoAddress()
{
try
{
//读取硬盘序列号
ManagementObject disk;
disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
disk.Get();

string MoAddress = "SOFT";
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
foreach (ManagementObject mo in moc2)
{
if ((bool)mo["IPEnabled"] == true)
{
string a = mo["MacAddress"].ToString();
string c = disk.GetPropertyValue("VolumeSerialNumber").ToString();
MoAddress = "SOFT-" + a + "-" + c;
break;
}
}
return MoAddress.ToString().Replace(":", "");
}
catch
{
return "ERR-SOFT";
}

public string GetMd5(object text)
{
string path = text.ToString();

MD5CryptoServiceProvider MD5Pro = new MD5CryptoServiceProvider();
Byte[] buffer = Encoding.GetEncoding("utf-8").GetBytes(text.ToString());
Byte[] byteResult = MD5Pro.ComputeHash(buffer);

string md5result = BitConverter.ToString(byteResult).Replace("-", "");
return md5result;
}


...全文
1373 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
PaulyJiang 2013-08-09
  • 打赏
  • 举报
回复
只要用一种可逆的加密算法即可, 如RSA,服务方公钥 A 私钥B,客户机MAC MA 有效期C, 客户端配置:有效日期D,服务方公钥A。 生成key:将客户MA和有效期C通过特定方式组合起来,通过服务方私钥B加密将密文作为key存放到客户端配置里。 客户端验证:将密文key通过配置的公钥A去解密,将解密后的结果与本机的MAC和配置的日期通过相同的方式组合起开看结果是否相同,相同则OK,不同则密文key或者有效期有修改。
dota_sky_god 2013-08-09
  • 打赏
  • 举报
回复
加密算法可以逆推的不少的,DES也可以,不管怎么样,可逆推的加密算法你只要掌握着自己的KEY就可以了
hyblusea 2013-08-09
  • 打赏
  • 举报
回复
可以使用AES算法
hyblusea 2013-08-09
  • 打赏
  • 举报
回复
引用 3 楼 pfworld 的回复:
问题是,我要读取授权信息呀,也就是说我要读取MD5生成的信息(解密后)
MD5是单向加密,公开加密算法,但无法逆推的
  • 打赏
  • 举报
回复
打个比方吧,假设没有送电线路,你敢说电力公司也给你家供电?
  • 打赏
  • 举报
回复
你可以让人家单机时只能做点单机的事情,例如只能用Excel编辑数据(模板是你提供的)。等联网之后,跟系统同步就行了。 没有网络,我们什么服务都不提供。我们不是做单机小程序的!
屌絲來襲 2013-08-07
  • 打赏
  • 举报
回复
他要換機器你就讓他在原機器上反註冊,如果是單機的話,就讓他提供相關證明,證明他已經執行了反註冊,比如反註冊后計算出一個反註冊碼,給你們驗證,通過的話就給他新機器一個新的註冊碼,供他使用,如果是聯網,那驗證就方便多了...
华为黑名单 2013-08-07
  • 打赏
  • 举报
回复
你用的是3DES加解密算法 MD5算法不可逆 除非暴力破解 现在一般使用 ACTIVEX做成服务器控件比较多了 常见的U顿 啥的都是用这个搞的
feiniao19830822 2013-08-07
  • 打赏
  • 举报
回复
引用
因为用户计算机没有网络,因此根据机器码+授权时间生成注册码,如果用户说换计算机了,如何保证软件权益?
你说我们现在正好提供一种套餐,3个注册码是xxx元,便宜xxx元,特别适合你这样的客户。
kxyzjm62 2013-08-07
  • 打赏
  • 举报
回复
加密后的密码过短的话易被用户破解,其实加密这个事就是制造个障碍。你要解析加密后的信息,就必须能够反向回推。具体到算法就看你自己如何考量了。不过任何加密算法都是可以破解的,只是时间问题。
颖之慕 2013-08-06
  • 打赏
  • 举报
回复
md5单项加密算法。不能解密的哈。。
pfworld 2013-08-06
  • 打赏
  • 举报
回复
实际上我用的是这个

#region ========加密========

/// <summary>
/// 加密
/// </summary>
/// <param name="Text"></param>
/// <returns></returns>
public static string Encrypt(string Text)
{
return Encrypt(Text, "xxxxx");
}
/// <summary>
/// 加密数据
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text);
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}

#endregion

#region ========解密========


/// <summary>
/// 解密
/// </summary>
/// <param name="Text"></param>
/// <returns></returns>
public static string Decrypt(string Text)
{
return Decrypt(Text, "xxxxxx");
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}

#endregion

threenewbee 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 pfworld 的回复:
问题是,我要读取授权信息呀,也就是说我要读取MD5生成的信息(解密后)
MD5是摘要算法,不能“解密”。
winner2050 2013-08-06
  • 打赏
  • 举报
回复
这要花钱买软件,那么低素质的事应该不会干。 使用正版软件的人,觉得能在更多电脑上用,是占便宜的事。 干嘛不直接用盗版。
pfworld 2013-08-06
  • 打赏
  • 举报
回复
问题是,我要读取授权信息呀,也就是说我要读取MD5生成的信息(解密后)
全栈极简 2013-08-06
  • 打赏
  • 举报
回复
可以在md5生成的code当中截取中间的某一段。
threenewbee 2013-08-06
  • 打赏
  • 举报
回复
你不能在MD5中截取几位么?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧