我的任务是为应用程序实现基于加密狗的复制保护方案。我意识到无论我做什么,总会有人破解它,但我至少想让它比if-语句检查是否存在加密狗更困难一点。
我的方法是加密应用程序正确执行所需的关键数据。在运行时,从加密狗中检索解密密钥(我们选择的模型具有一些合适的API函数),数据被解密,应用程序是满意的。
当然,有决心的攻击者可以截获该解密密钥,还可以获得解密的数据。没关系。但最困难的应该是替换他们自己的数据。所以我正在寻找一种加密方案,在这种方案中,知道解密密钥的人不能加密自己的数据。
这显然是非对称加密。但到目前为止,对于我发现的每一种算法,加密(或公共)密钥都可以从解密(或私有)密钥生成,这正是我试图避免的。
注意:简单地对数据进行签名不会有太大帮助,因为(除非我完全误解了这样的签名)验证签名只是另一个if语句,很容易被规避。
所以..。有什么想法吗?
发布于 2013-01-29 18:51:31
为了回答我自己的问题(在某种程度上),使用RSA可以做到这一点,但大多数API(包括OpenSSL的加密库)需要被“欺骗”才能做到这一点。在给定私钥的情况下,可以生成公钥的原因是
对于RSA的实现来说,在私钥数据中保存p和q(那些大素数)是很常见的做法。公钥(由模数N和一些指数e组成)是公开的。不管怎样,(通常)选择一个晦涩难懂的e是没有意义的。因此,有几个常用的标准值,比如3或65537。(
但是,RSA是对称的,因为您用公钥加密的任何东西都可以用私钥解密,反之亦然。所以我所做的(我是个怪物)就是让密码库生成RSA密钥。您可以在那里选择自己的公共指数,稍后将用于解密(与正常方式相反)。然后,我在键数据结构中切换公共和私有指数。
对于任何想要使用加密库做类似事情的人,有一些建议:
如果有人需要更多的帮助,请留下评论,我会编辑这篇文章的更多信息。
发布于 2013-01-26 04:39:40
一旦攻击者知道了私钥,您就不会有任何秘密信息来将自己与其他人区分开来。为了使攻击者更难:您可能希望在应用程序特定的时间T之后使每一对(公钥、私钥)过期,并基于加密狗和您自己的机器上的前一对独立地生成新的对。这样,攻击者需要不断地访问加密狗,以便能够使用新的私钥加密他的数据,或者像T一样频繁地运行他的private_key_detection算法。
发布于 2013-01-26 05:06:35
你可能想在加密狗上运行解密。有一些硬件可以帮助实现这一点(I just googled this one, for example.)。可能有很多others....Dallas半导体公司曾经有一个Java键,可以让你在一个像加密狗一样的小设备上运行代码,但我认为他们不再有这个功能了。
其中一些允许您在加密狗中执行代码。因此,也许一个很难重新创建但对性能要求不高的关键函数可能会起作用?也许是一种许可证密钥验证算法。
也许您可以在软件狗中包含代码,这些代码必须放入内存中才能运行。这可能更难打破,但可能很难实现,这取决于您正在使用什么工具来编写程序。
您可能还想研究一些反调试主题。我记得前段时间看过一些出版物,but here is at least one。这是另一层,将使其更难破解。
对Internet连接的依赖性也可能是一种选择。在这里你必须小心,如果你的客户不能让你的代码在没有互联网连接的情况下运行,你就不能惹恼他们。
你也可以看看FlexLM (或者现在叫它什么)。它是有效的,但它是一头野兽。如果我没记错的话,他们还试图与你们公司协商一定比例的毛利,以换取许可费(已经有好几年了……我想当他们提出要求时,我们已经告诉他们不要再提了。)
祝好运!
https://stackoverflow.com/questions/14529732
复制相似问题