使用两个公钥加密文件

4

我不确定这是否是正确的地方提问,因为这可能是一个更基于理论的问题。但我也对以下内容的C#实现很感兴趣,并且它是否可行。

我计划使用PGP来加密和解密文件。是否可以使用两个公钥(我的公钥和接收者的公钥)加密文件,以便我可以使用任何一个私钥解密文件。 这种情况可行吗? 如果可行,那么我应该采取什么步骤才能正确实现相同的功能。 任何帮助都将不胜感激。


这不就相当于存储每个文件的两份副本,一份用key_1加密,另一份用key_2加密吗? - melpomene
这是通过PGP实现的,正如Victor在下面解释的那样。混合加密的工作方式是生成一个随机对称密钥,并使用类似AES的东西进行大量加密。然后将随机会话密钥加密在每个接收者的公钥下,以便您仍然只有1份消息,但可以由多个方阅读。它也更快,因为公钥算法往往非常慢,所以您希望最小化它处理的数据。 - mfanto
4个回答

4
请查看这个维基页面:http://en.wikipedia.org/wiki/Pretty_Good_Privacy
你会发现实际数据是使用随机密钥加密/解密的,而这个随机密钥又是使用相应的公钥/私钥加密/解密的。
因此,结果就是你不必使用两个密钥来加密文件(数据)。你仍然使用一个随机密钥来加密数据。唯一的区别是你使用多个公钥(例如你和接收者的公钥)来加密这个随机密钥。
结果,任何一个人都能够使用私钥解密随机密钥并解密数据。

3
在高级别上(如果您使用任何PGP API),是的,您可以将两个或多个公共PGP密钥传递给OpenPGP API(或软件)并加密数据。然后,您将能够使用与任何已使用的公共PGP密钥相对应的PGP秘密密钥解密数据。
在较低级别上 - OpenPGP始终生成用于加密数据的对称密钥,然后使用一个或多个公共PGP密钥来加密此密钥,因此使用多少密钥没有区别。
现在,要使用什么取决于您使用的平台和开发环境(由于这是一个编程网站,我们假设您将在代码中加密数据)。对于Linux和C,存在GnuPG库。对于Java和C#,BouncyCastle提供了一些PGP支持。最后,我们的SecureBlackbox库的OpenPGPBlackbox为许多平台和语言(包括.NET、VCL、ActiveX和C++)提供了完整的OpenPGP功能范围。
顺便说一句,您接受的答案完全错误,所以我强烈建议您取消接受它。

我能够理解你的回答并完成我的工作。谢谢! - Ron

0
这个问题也可能属于crypto.stackexchange.com,但在这里也可以。我不确定您是否理解了PGP的原理。公钥用于加密,私钥用于解密。因此,如果您使用自己的公钥进行加密,则接收者使用他/她自己的私钥进行解密和/或签名。
如果您想了解更多信息,建议您阅读RSA或ElGamal算法。希望能帮到您。

这两种算法都提供了一个很好的起点。或者你可能想参加斯坦福大学提供的一些在线课程:


Vlad,感谢您的回复。您提供的链接非常有用。我想知道是否可以使用两个公钥加密文件,并且这两个公钥可以单独解密文件而不需要两个公钥都存在。我的目的是使用多个公钥为各个客户加密文件,以便他们都可以使用自己的私钥进行解密。我只是想知道这是否可行。 - Ron
确实有可能。我不记得正确的算法,但是Bruce Schneier的书籍展示了它。“应用密码学”对你会有所帮助。但是它比你想象的要复杂。使用两个公钥进行加密需要通过两个私钥进行解密。创建私钥和/或公钥之间的关系是必要的。另一个信息丰富的文档可以在ICAR上找到:http://www.iacr.org/archive/eurocrypt2000/1807/18070262-new.pdf - Andre

-4
我唯一能想到的方法是创建一个包含两个文件的zip或tar归档文件:一个使用密钥1加密,另一个使用密钥2加密。
如果文件是文本,则可以将同一原始文件的两个不同加密版本粘贴到一个文档中。
据我所知,没有办法加密一个文件,使其可以使用两个不同的密钥进行解密。

正确的做法是生成一个随机的对称密钥来进行大块加密,然后在每位接收者的公钥下加密会话密钥。公钥算法太慢以至于无法处理大量数据,因此混合方法是最好的选择。 - mfanto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接