0

我的任务是为应用程序实施基于加密狗的复制保护方案。我意识到无论我做什么,都会有人破解它,但我至少想让它比检查加密狗是否存在的 if 语句更难一些。

我的方法是加密应用程序正确执行所需的关键数据。在运行时,从加密狗中检索解密密钥(我们选择的模型有一些合适的 API 函数),数据被解密并且应用程序很开心。

当然,坚定的攻击者可以拦截该解密密钥并获取解密数据。没关系。但应该很难的是替换他们自己的数据。因此,我正在寻找一种加密方案,其中知道解密密钥不会使某人能够加密自己的数据。

这显然是非对称加密。但是对于到目前为止我发现的每一个这样的算法,加密(或公钥)密钥都可以从解密(或私钥)密钥中生成,这正是我想要避免的。

注意:简单地对数据进行签名不会有太大帮助,因为(除非我完全误解了这样的签名)验证签名将只是另一个 if 语句,这很容易被规避。

所以......有什么想法吗?

4

3 回答 3

3

一旦攻击者知道了私钥,您就没有任何秘密信息可以将自己与其他人区分开来。为了让攻击者更难:您可能希望在应用程序特定时间 T 之后使每对(公钥、私钥)到期,并在加密狗和您自己的机器上独立地根据前一对生成一个新对。这样,攻击者需要持续访问加密狗才能使用新的私钥加密他的数据,或者像 T 一样频繁地运行他的 private_key_detection 算法。

于 2013-01-25T20:39:39.607 回答
2

您可能想在加密狗上运行解密。有一些硬件可以帮助实现这一点(例如,我刚刚搜索了这个。)。可能还有很多其他的......达拉斯半导体曾经有一个Java按钮,可以让您在类似设备的小型加密狗上运行代码,但我认为他们不再拥有它了。

其中一些允许您在加密狗中执行代码。那么也许一个难以重新创建但不需要高性能的关键功能可能会起作用?也许是许可证密钥验证算法。

也许您可以在加密狗中包含必须放入内存才能运行程序的代码。这将有点难以破解,但可能难以实现,具体取决于您用于制作程序的工具。

您可能还想学习一些反调试主题。我记得不久前看过一些出版物,但这里至少有一个。这是另一层,将使其更难破解。

依赖 Internet 连接也可能是一种选择。如果您的客户无法在没有 Internet 连接的情况下运行您的代码,您必须小心不要惹恼他们。

您还可以查看 FlexLM(或现在所谓的任何名称)。它有效,但它是一个野兽。如果我没记错的话,他们还试图就您公司毛利润的一定百分比协商许可费(已经好几年了……我想我们告诉他们在他们要求的时候把它塞进去。)

祝你好运!

于 2013-01-25T21:06:35.410 回答
0

为了回答我自己的问题(有点),可以使用 RSA 来做到这一点,但是大多数 API(包括 OpenSSL 的加密库之一)都需要被“欺骗”才能做到这一点。给定私钥,您可以生成公钥的原因是

  1. RSA 的实现将 p 和 q(那些大素数)保存在私钥数据结构中是常见的做法。

  2. 由于公钥(由模数 N 和一些指数 e 组成)无论如何都是公开的,因此(通常)选择一个晦涩的 e 是没有意义的。因此,有一些常用的标准值,例如 3 或 65537。因此,即使 p 和 q 未知,您也可以“猜测”公共指数。

但是,RSA 是对称的,因为您使用公钥加密的任何内容都可以使用私钥解密,反之亦然。所以我所做的(我是个怪物)是让加密库生成一个 RSA 密钥。您可以在那里选择自己的公共指数,稍后将用于解密(与正常方式相反)。然后,我在关键数据结构中切换公共和私有指数。

任何尝试使用加密库做类似事情的人的一些提示:

  1. 在 RSA 数据结构中,清除除 n 和 e / d 之外的所有内容,具体取决于您是否要使用该特定密钥进行加密或解密。

  2. 使用 RSA_blind_off 关闭致盲。即使在解密时它也需要加密指数,这不是我们想要的。请注意,这可能会使您受到一些攻击。

如果有人需要更多帮助,请发表评论,我会编辑这篇文章并提供更多信息。

于 2013-01-29T10:51:31.047 回答