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

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

据我目前收集到的信息,人们要么推荐 AES,要么推荐 RSA。老实说,我在大学里的方向是另一个方向(不是密码学),而且我上的一门密码学课是前一段时间的。但据我记得,AES 是一种对称加密算法,这意味着我只有一个密钥用于加密和解密,对吧?然后,我如何生成数千个产品密钥并仍然在我的应用程序中验证它们(顺便说一句,这不需要互联网访问……因此无需通过服务器进行检查)?

所以我想 RSA 会是最佳选择?但是 RSA 不是会生成相当长的密钥(至少比上面要求的 25 个字符长)吗?

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

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

问候,

塞巴斯蒂安

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

有帮助吗?

解决方案

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

因此,非对称密码学是最佳选择。基本前提是这样的:

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

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

其他提示

生活更简单,如果你只需购买一个解决方案。

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

卡吉允许你收款,他们帮助您管理的关键。

一个人已经在博客他如何处理登记号码的问题。他的一个博客条目是生成唯一注册号

是的,RSA 和 AES 是两种截然不同的东西:

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

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

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

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

您可以看看这个代码项目文章。它描述了基于其中执行软件的计算机的MAC地址的软件密钥的实现。该方法不理想,作为导演自己也承认,这是你在找什么有点不同,但也许它可以帮助你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top