我可以使用两个私钥的非对称加密吗?

时间:2011-04-14 11:49:12

标签: encryption cryptography public-key-encryption encryption-asymmetric

根据维基百科(和其他来源),非对称加密总是这样:

  • 甲方有公钥和私钥
  • 乙方使用A的公钥加密内容
  • 甲方使用私钥解密内容

但是,我不希望甲方能够加密他们自己的数据,只希望他们能够解密它。使用非对称逻辑会导致:

  • 甲方有私钥
  • 乙方有一个私钥(即甲方的公钥)
  • 乙方使用私钥加密内容
  • 甲方使用私钥解密内容

我们将使用它来进行某种许可证生成/检查。我们的客户可能不会生成许可证,但许可证文件必须在客户端可读。

这仍然是非对称加密还是应该考虑不同的方法?

7 个答案:

答案 0 :(得分:3)

能够使用公钥加密邮件的甲方完全没问题

只有您可以解密它们(使用您的私钥)并且由于您没有理由这样做,使用应用程序中嵌入的公钥加密某些内容不会造成任何伤害 - 只是用户拥有的一堆无用数据,因为他不能解密它。

对于许可,您只需使用私有密钥加密(或签署 - 这足以让人们能够读取许可文件中的限制等但不会修改它们)您的许可文件。然后,应用程序使用嵌入的公钥解密文件(或验证签名)。

提取公钥并使用它签署自定义许可文件的用户无法使用它,因为只有当您的私钥嵌入应用程序时它才会起作用(因为这是解密使用公钥加密的内容所必需的密钥)

但是,他可以很好地用自定义的公钥替换你的公钥(他也有私钥),然后使用他的私钥签名/加密他自己的许可文件。这不是一个加密问题 - 你只需要添加一些反破解/修改措施,以便更换嵌入式公钥变得更加困难。例如,你可以做一些校验和验证。

答案 1 :(得分:2)

您的私钥在保险柜中,并发布您的公钥。创建许可证时,使用私钥对其进行加密。客户端只能使用您的公钥解密它。

如果要将许可证限制为客户端,请要求客户端生成其密钥对,并将其公钥发送给您。然后,您使用其公钥加密许可证,然后使用您的私钥对其进行签名(或再次加密)。

当客户收到他们必须的许可证时 1.验证您发送的许可证的签名(或解密) 2.使用自己的私钥解密验证数据。

这确保了1.只有你可以向他们发送许可证而且2.只有他们可以解密它。

答案 2 :(得分:1)

您通常要做的就是为您生成许可证,并使用您的私钥对其进行加密。然后您的客户端可以使用您的公钥读取它。这(非常广义地说)证书方案(例如用于使用HTTPS的安全在线浏览)如何工作。是的,这仍然绝对算作非对称加密。

答案 3 :(得分:1)

根据您所说的,非对称加密仍然是您想要的,它只需要以与您习惯的不同的方式完成。

假设您为A生成一对密钥对。您发送A对的一半:它并不重要,但我们将其称为私有一半。您使用公共半部加密并将其发送到A.然后A可以解密它。但A将无法加密看似来自A公钥的邮件,因为它们只有密钥的私有部分,如果只有一半密钥,则无法找出密钥的另一半,不管你有哪一半。因此,A只能加密可以通过您保密的公钥解密的消息。

当然,正如其他海报已经说过的那样,有更好的方法可以设置这个协议。一旦你理解了非对称加密的细节并且看过我们喜欢称之为关键的一半以及我们通常如何使用它们,就试着解释为什么这不是一个真正的问题。

答案 4 :(得分:1)

答案 5 :(得分:1)

其他答案已经说明了怎么做...这里只是一个注释(至少对于RSA)你在问题中描述的方案安全,如果它取决于B的密钥保守秘密。

对于RSA,公钥和私钥实际上是非对称的,您不能简单地交换它们并期望相同的安全属性。

  • 如果您的B方(Bob)使用相同的公钥加密多条消息,那么读取这些(密文)消息的攻击者可以轻而易举地获取您的公钥。攻击者没有获得明文或私钥,但公钥将永远变得“公开”。
  • 对于A(Alice),甚至可以从私有密钥创建公钥,而不会使用公共密钥加密任何消息。

我认为其他非对称密码系统也存在类似的警告 - 总是只使用它们,就像它们被指定和证明一样。

在这种情况下,您将组合两个密钥对:B是签署/验证消息的一个(以确保消息是由B发送的),A是用于加密/解密消息的密钥对(以确保只有A可以读它)。

答案 6 :(得分:0)

是。您可以使用RSA进行 - 进行类似Diffie-Hellman的交换,因为不仅来自1对关键对的密钥通勤,而且来自不同密钥对的密钥也可以通勤。

alice -> bob: alice.pub bob -> alice: bob.pub alice: r = random.secret() alice -> bob: ( r * (alice.priv * bob.pub) ) bob: r = ( (r * (alice.priv * bob.pub)) * (bob.priv * alice.pub) )

请注意,我们在这里做了一些奇怪的事。我们在一次操作中混合了来自不同密钥对的RSA操作。括号中的对象实际上是一个新的虚拟RSA密钥,这些密钥中没有一个是公共的。如果我们试图直接创建该RSA密钥,alice或bob将知道该对的两个密钥。这个密钥对实际上是一个秘密密钥,你写到一端只有另一边可以解密它,但你不能解密你自己写的东西,没有其他人可以加密消息到另一边。

我从来没有见过像这样混合密钥对的人,但是我通过编写代码来测试它。我不得不做一些与众不同的事情,因为通常情况下,将私钥应用于邮件是为了签署'。但签名通常会隐藏秘密,并将私钥应用于它的哈希;我们不想要的东西。所以在我的代码中,一旦我将RSA组件(D,E,N)提取为任意精度数...即:解密,加密,模数......我刚刚做了:

wormholeSend(me,you,msg) = (((me ^ {me_D}) \% me_N) ^ {you_E}) \% you_N

让它变得有点棘手的是E(加密指数)实际上是一个可预测的值,但模数N在公钥(E,N)中。 D对每一方都是私人的。我们在这里需要小心,因为你和我有不同的模数N。

我这样做是因为我想要一个系统,其中一个程序被授权加密可由用户解密的密钥。这样做,用户无法加密密钥,程序也无法解密。