使用公钥和私钥(用于加密)加密困惑

时间:2010-06-04 15:02:27

标签: java encryption drm private-key public-key-encryption

当客户向我的服务器询问许可证时,我正在制作许可证系统,如果允许他们拥有许可证,我会向他们发送许可证。

在我当前的系统上,我使用单个私钥加密许可证,并将公钥嵌入客户端应用程序中,用于解密许可证。它有效!

其他人告诉我,我应该使用服务器上的公钥加密并将私钥分发给客户端。我搜索过网络,可以看到有时他们使用私钥加密,有时他们使用公钥加密。

在这种情况下,我该怎么做?

6 个答案:

答案 0 :(得分:8)

  

其他人告诉我,我应该这样做   使用公钥加密   服务器和分发私人   客户关键。

那些人错了。名称​​私钥意味着它是私有的意味着只有您才有权访问它。

  

在这种情况下,我该怎么做?

使用数字签名。使用您的私钥对许可文件进行签名,并在您的应用程序中使用您的公钥来验证许可证上的签名是否来自您。

答案 1 :(得分:4)

恭喜,您刚刚发明了RSA签名。 (无论如何,这应该是您应该使用的。)要与公钥系统通信,您需要使用私钥一次和公钥一次,但RSA支持两个不同的顺序: 1)使用公钥加密,使用私钥解密:收件人不知道有关邮件来源的任何信息,但发件人知道只有收件人(私钥的持有者)才能读取它。这是经典的“加密”。 2)用私钥“加密”,然后与公众“解密”。这是一个数字签名,并提供身份验证。任何人都可以阅读邮件,但只有私钥持有人可以发送邮件。

假设您的许可证是为客户端定制的(可能就像包含客户端生成的随机数的副本一样简单),那么它对其他任何人都没用,但是客户端可以确保服务器发送了它。 / p>

在实践中,对称性并不是那么整洁;不同的操作模式有不同的弱点和缺陷,因此实现通常会有很大不同,但这是一般的想法。

密码学的第一个也是最重要的一课是理解身份验证以及何时使用它。它至少需要加密,并且不知道何时使用它会使您处于Midvale School for the Gifted状态。

答案 2 :(得分:1)

如果要加密仅由单个收件人读取的内容,则使用该收件人公钥加密,并使用其私钥进行读取。

如果要为多个收件人进行加密,则可以使用私钥加密,并将公钥分发给您希望能够读取的公钥。这通常被称为“签名”,因为任何有权访问您的公钥的人都可以阅读它,因此它实际上并不是一种私人通信形式。

一个整体更强大的解决方案是让您的应用程序为每个安装生成密钥对,将其生成的公钥发送回服务器,然后您将使用该公钥进行加密,以便只使用该单个安装您创建的许可证(通过使用其私钥解密)。

答案 3 :(得分:1)

至少在典型的公钥加密算法(例如,RSA)中,公钥和私钥之间并没有真正的主要区别。生成密钥时,您将获得两个密钥。你保留一个私人并发布另一个 - 但是你发布的是哪一个以及你保密的哪个并不重要。

使用一个密钥加密的任何内容都可以使用另一个密钥进行解密。出于正常目的,您发布一个密钥,允许任何人加密只能解密的内容。从技术角度来看,反向工作正常:如果使用私钥加密某些内容,任何拥有公钥的人都可以对其进行解密。这通常用于签名验证之类的事情(即,具有公钥的任何人都可以验证签名必须是使用私钥创建的)。您通常希望使用单独的密钥对进行加密和签名。

对于您的情况,您可能会对某些问题持开放态度。您当然可以加密使用该程序所需的一些数据,因此用户需要密钥来解密它并使用该程序 - 但如果用户愿意将代码的副本提供给未经授权的人这个人,他们可能会毫不犹豫地给他们一份钥匙副本。因此,即使加密/解密能够完成它的工作,它也不可能提供任何真正的保护。

更典型的许可方案与特定IP地址相关联,因此您可以执行加密IP地址等操作,然后将结果用作密钥来解密使用该程序所需的数据。如果IP地址错误,则数据未正确解密,并且程序不起作用。只要用户具有静态IP地址,这可以很好地工作 - 但会导致与DHCP一起出现问题。

我的直接建议就是不要这样做。无论如何你坚持要这样做,不要自己动手 - 得到类似FlexNet的东西来为你处理它。如果没有它你会更好,但至少这样你会得到的东西,你不会浪费时间和精力去做更好的目的,比如改善你的软件。

答案 4 :(得分:0)

如果您使用的是公共 - 私有(非对称)加密,则始终使用收件人的公钥进行加密,该公钥使用其私钥进行解密。对于数字签名,您使用私钥进行签名,收件人使用其公钥验证签名。

然后出现问题,您如何建立安全的DRM系统?如果您使用加密,并为收件人提供私钥,他们可以分发密钥或解密的内容。如果您使用签名,他们可以简单地删除您的程序的签名验证部分。

答案是,这是不可能的。 DRM的概念存在根本缺陷。

答案 5 :(得分:0)

希望维基百科的这个链接有所帮助。 PKI基于相互信任。但是私钥必须由所有者保护。顾名思义,公众对所有人开放。整个架构是为了帮助您在问题中定义的场景。