23

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

不过,我的问题是我不太确定如何实施产品密钥验证。我想到的是客户可以在我的网页上注册(在试用产品一段时间后),支付产品费用,并通过 e 获得 aaaaa-bbbbb-ccccc-ddddd-eeeee 形式的产品密钥-mail(或者可以通过他在我网站上的个人资料获得)。到目前为止没有问题。然后他/她将密钥放在我的应用程序的适当关键字段中,然后应用程序注册成功。

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

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

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

去这里最快、最简单、最安全的方式是什么?:-) 代码示例将是糖!

问候,

塞巴斯蒂安

PS:哦...请不要告诉我我的密钥在某个时候会如何被破解......我知道,这主要是为什么我不想花很多时间在这个问题,但同时也不能让偶尔的破解者变得太容易。

4

5 回答 5

35

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

出于这个原因,非对称密码学是要走的路。基本前提是这样的:

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

当然,这只是基本的想法。有关更多详细信息和源代码,请参阅基于椭圆曲线加密的产品密钥

于 2009-03-14T19:19:41.127 回答
1

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

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

Kagi 允许您收款,他们可以帮助您管理密钥。

于 2009-03-14T15:41:05.117 回答
0

一个人写了一篇关于他如何处理注册号问题的博客。他的一篇博客文章是生成唯一注册号

于 2009-03-14T15:54:41.370 回答
0

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

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

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

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

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

于 2009-03-14T16:23:43.313 回答
0

您可以查看此代码项目文章。它描述了基于执行软件的机器的 MAC 地址的软件密钥的实现。正如作者本人承认的那样,该方法并不理想,并且与您正在寻找的方法有些不同,但也许它可以帮助您。

于 2009-03-14T18:39:17.527 回答