其他答案已经说过怎么做了......这里只是一个说明(至少对于RSA)你在问题中描述的方案是 不 安全,如果它取决于B的关键保密。
对于RSA, 的 公钥和私钥实际上是不对称的 强> ,你不能简单地交换它们并期望相同的安全属性。
我想其他非对称密码系统也有类似的警告 - 总是只使用它们,就像它们被指定和证明一样。
在这种情况下,您将组合两个密钥对:B是一个用于签名/验证消息(以确保消息是由B发送的),A是用于加密/解密消息的密钥对(以确保只有A可以读取它) 。
是。您可以使用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)提取为任意精度数字...即:decrypt,encrypt,modulus ...我刚刚做了:
wormholeSend(me,you,msg) = (((me ^ {me_D}) \% me_N) ^ {you_E}) \% you_N
让它变得有点棘手的是E(加密指数)实际上是一个可预测的值,但模数N在公钥(E,N)中。 D对每一方都是私人的。我们在这里需要小心,因为你和我有不同的模数N.
我这样做是因为我想要一个系统,其中一个程序被授权加密可由用户解密的密钥。这样做,用户无法加密密钥,并且程序无法解密它们。
您可以查看Rhino许可: http://hibernatingrhinos.com/open-source/rhino-licensing/introduction
您在保险箱中拥有私钥,并发布您的公钥。创建许可证时,使用私钥对其进行加密。客户端只能使用您的公钥解密它。
如果要将许可证限制为客户端,请要求客户端生成其密钥对,并将其公钥发送给您。然后,您使用其公钥加密许可证,然后使用您的私钥对其进行签名(或再次对其进行加密)。
当客户收到他们必须的许可证时 1.验证您发送的许可证的签名(或解密) 2.使用自己的私钥解密验证数据。
这确保了1.只有您可以向他们发送许可证,并且2.只有他们可以解密它。
根据你所说的,非对称加密仍然是你想要的,它只需要以一种不同于你习惯的方式来完成。
假设您为A生成一对密钥对。您发送A对的一半:它并不重要,但我们将其称为私有一半。您使用公共半部加密并将其发送到A.然后A可以解密它。但A将无法加密看似来自A公钥的邮件,因为它们只有密钥的私有部分,如果只有一半密钥,则无法找出密钥的另一半,不管你有哪一半。因此,A只能加密可以通过您保密的公钥解密的消息。
当然,正如其他海报已经说过的那样,有更好的方法可以设置这个协议。一旦你理解了非对称加密的细节并且看过我们喜欢称之为关键的一半以及我们通常如何使用它们,试着解释为什么这不是真正的问题。
甲方能够使用公钥加密消息 的 绝对没问题 强> 。
只有您可以解密它们(使用您的私钥),并且由于您没有理由这样做,使用应用程序中嵌入的公钥加密某些内容不会造成任何伤害 - 只是用户拥有的一堆无用数据,因为他无法对其进行解密。
对于许可,你只需加密(或签名 - 这就足够了,然后人们将能够阅读许可文件中的限制等但不能修改它们)你的许可文件使用你的 私人的 键。然后,应用程序使用嵌入的公钥解密文件(或验证签名)。
提取公钥并使用它签署自定义许可文件的用户无法使用它,因为只有当您的私钥嵌入应用程序时才会使用它(因为这是解密使用公钥加密的内容所必需的密钥)。
但是,他可以很好地用自定义密钥替换您的公钥(他也有私钥),然后使用他的私钥对自己的许可文件进行签名/加密。这不是一个加密问题 - 你只需要添加一些反破解/修改措施,以便更换嵌入式公钥变得更加困难。例如,您可以执行一些校验和验证。
您通常要做的就是为您生成许可证,并使用您的私钥对其进行加密。然后您的客户端可以使用您的公钥读取它。这(非常广义地说)证书方案(例如用于使用HTTPS的安全在线浏览)如何工作。是的,这绝对算作非对称加密。