【问题标题】:Encrypting large files using a public key使用公钥加密大文件
【发布时间】:2011-03-30 07:42:41
【问题描述】:

我需要使用公钥加密一个 100KB 的文件。我一直在阅读一些帖子,声称使用公钥直接加密大文件是不切实际的,首选方法是使用对称密钥加密文件,然后使用公钥加密此对称密钥。 似乎一个天真的解决方案是将大文件分解成碎片并使用相同的公钥加密它们中的每一个。我的问题是这个解决方案是否以及为什么是错误的?

【问题讨论】:

    标签: public-key-encryption encryption-asymmetric


    【解决方案1】:

    除了对称密钥加密的速度提升之外,还有另一个可能的好处:通过首先使用随机安全生成的对称密钥加密消息,您可以为多个收件人加密对称密钥,一次在每个收件人自己的公共非对称密钥,无需重新加密整个消息。

    【讨论】:

      【解决方案2】:

      非对称加密太慢了,最常用的方法是用非对称加密随机对称密钥,然后用那个对称密钥加密你的数据。 而且,最好的方法是为此目的使用众所周知的协议/标准(例如 OpenPGP)。

      【讨论】:

      • 还有 GnuPG - GnuPG 是 OpenPGP 标准的实现之一。还有其他商业实现,可以更灵活、更实用。
      【解决方案3】:

      如果我没听错的话,你想用别人的公钥加密文件,然后用他们的私钥解密?

      使用对称加密并且仅对(对称)密钥使用公钥加密的优势在于性能:对称加密在计算上的资源密集度要低得多(权衡:您必须对密钥保密 - 这就是第二个,不对称的步骤是)。

      分解文件会增加管理开销(您如何确定会有多少块?您已将它们全部传输?)并且不会增加任何安全性。恰恰相反。

      【讨论】:

      • 通过为每条消息随机生成一个新密钥,以公钥加密的方式将其传输给收件人,然后将其丢弃,从而解决了保持共享密钥秘密的问题。
      • 另一种方法是将两者结合起来。第 1 步:创建任何随机密钥,例如 64 字符字符串(512 位) 第 2 步:使用第 1 步中的密钥对文件进行对称加密 第 3 步:使用任何非对称加密(公钥)对密钥进行加密 第 4 步:将步骤 3 的结果添加到加密文件的末尾。解密: 第 1 步:读取并删除文件的最后 XXX 位 第 2 步:使用您的私钥解密第 1 步中的数据 第 3 步:使用第 2 步结果的密钥解密文件
      • 是的,我澄清了回复 - 我是在笼统地说关于保持密钥秘密,这就是 publickey 步骤的用途。
      【解决方案4】:

      将文件分割成更小的部分,然后用一些非对称密码对其进行加密与加密过程的运行时间成本无关。最佳做法是使用相对强大的密钥使用良好的对称密码加密数据,并使用非对称密码(使用您的公钥)加密您在对称加密中使用的密钥。

      【讨论】:

      • 如果不考虑性能,为什么混合加密是最佳实践?
      • 我的意思是,如果您拆分文件并再次使用非对称加密,性能不会提高。在混合方法中,您具有使用对称密码加密大数据的优势,因为与非对称密码相比,对称密码相对更省时。假设您的密钥是 256 位/32 字节,您只需使用非对称密码加密 32 字节的数据。这种方法比使用非对称密码加密整个文件要好。
      【解决方案5】:

      您提到的混合方法(生成随机对称密钥,使用它来加密数据,并仅对密钥进行非对称加密)具有巨大的性能优势。

      您也可以“将大文件分解并使用相同的公钥加密每个文件”,这没有什么问题,但速度要慢得多。

      【讨论】:

      • 分割文件是个坏主意,en.wikipedia.org/wiki/Watermarking_attack
      • @TBH:是的,想想看,人们很容易发现重复的块等。另一方面,这个问题可以通过添加一些随机填充来解决。我仍然认为主要区别仅在于性能。
      • 从性能的角度来看,最好的办法是交换 AES(或 Serpent)加密密钥,并使用 symetrical-key 加密这些数据。
      猜你喜欢
      • 2017-01-04
      • 2011-10-31
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多