产品密钥的实现

时间:2009-03-14 15:24:27

标签: c encryption licensing key product

我正在用C实现一个小应用程序,我希望以后以合理的价格出售它作为共享软件。它将开始为期30天的试用,我已经非常确定如何实施它。

我遇到的问题是,我不太确定如何实施产品密钥验证。我的想法是,客户可以在我的网页上注册(在尝试产品一段时间后),支付产品费用,并通过eaaabbbb-ccccc-ddddd-eeeee获取产品密钥邮件(或者可以通过我的网站上的个人资料获得)。到目前为止没问题。然后他/她将密钥放在我的应用程序中的相应关键字段中,并且 boom 该应用程序已注册。

从目前为止我可以收集到的信息,人们会为此推荐AES或RSA。说实话,我在大学的另一个方向(不是密码学)和我之前的一个密码学课程。但是从我记忆中来看,AES是一种对称加密算法,这意味着我只有一个加密和解密密钥,对吗?然后,我怎么能生成数以千计的产品密钥并仍然在我的应用程序中验证它们(顺便说一下,这不需要互联网访问....所以不用服务器检查)?

所以我猜RSA会走的路?但是RSA不会生成相当长的密钥(至少比上面要求的25个字符长)?

another thread中,我读到某些产品甚至不会使用加密产品密钥生成/验证,而是只使用一些检查,例如“添加2.和17.字符,这应该总计为X”。

什么是最快,最简单,最安全的方式? :-)代码样本就是糖!

此致

塞巴斯蒂安

PS:哦......请不要告诉我我的钥匙能够在某些时候被破解.....我知道这一点,这主要是为什么我不想花很多钱这个问题的时间,但同时不会让偶尔的饼干太容易。

5 个答案:

答案 0 :(得分:30)

对称算法是有限的,因为任何带有反汇编程序的新手破解者都可以找到你的密钥(或用于生成密钥的算法)并制作“keygen”。

出于这个原因,非对称密码学是可行的方法。基本前提是这样的:

  • 当用户从您那里购买许可证时,您会收集有关用户和/或其环境的某些识别详细信息(通常,这只是一个全名;有时也是公司)。
  • 您对此信息进行了128位MD5哈希。
  • 使用128位Elliptic Curve加密,使用服务器上的私有密钥加密此哈希。
  • 128位密文可以作为25个字符的字符串表示给用户,该字符串由字母和数字组成(加上分隔符号以便于阅读)。注意,26个字母+10个数字= 36个离散值,并且36 ^ 25> 2 ^ 128。
  • 用户在注册对话框中键入此产品密钥。客户端软件将其转换回128位数字(16字节),使用EC加密的公钥对其进行解密,并将结果与​​用户个人信息的MD5哈希值进行比较,该哈希值必须与用于注册的内容相匹配

这当然是基本的想法。有关更多详细信息和源代码,请参阅Product Keys Based on Elliptic Curve Cryptography

答案 1 :(得分:1)

如果您只是购买解决方案,生活会更简单。

http://www.kagi.com/kagisolutions/index.php

Kagi允许您收取付款,并帮助您管理密钥。

答案 2 :(得分:0)

一个人在博客上写了他如何处理注册号码的问题。他的一篇博客文章是Generating Unique Registration Numbers

答案 3 :(得分:0)

是的,RSA和AES是两个非常不同的东西:

  • RSA是公钥加密,涉及公钥和私钥,速度相当慢。主要用途是建立对称加密会话密钥的安全交换。
  • AES是对称加密,快速而安全。

由于您的应用不通过公共频道进行通信,并且加密的使用仅限于产品激活/注册,因此您需要使用对称密码。公钥密码的好处在于密钥管理,您将在您的网站上或通过电子邮件处理。

请注意,您不必为每个客户分配相同的密钥。您可以生成一些注册信息的哈希值,并将其与其他内容进行异或(也许是一个固定的会话密钥)。将其发送给客户,程序可以生成相同的哈希值,并且您发送的密钥将生成原始固定密钥的XOR。

处理密码术不是轻易做到的事情。正如你所提到的,你希望这会被破解。如果你自己做,这几乎肯定会发生。你仍然可以使用你自己的实现来“保持诚实的人诚实”,但你会意识到这是你所能得到的。如果您需要更强大的东西,那么在对解决方案进行彻底研究后,您应该购买解决方案。

答案 4 :(得分:0)

您可以查看此Code Project文章。它描述了基于执行软件的机器的MAC地址的软件密钥的实现。这个方法并不理想,正如导演自己承认的那样,它与你所寻找的有点不同,但也许它可以帮到你。