【问题标题】:How to encrypt large file with RSA?如何使用 RSA 加密大文件?
【发布时间】:2021-11-27 17:05:23
【问题描述】:

代码https://play.golang.org/p/CUEqjsJq5c

错误:

panic: crypto/rsa: message too long for RSA public key size

goroutine 1 [running]:
panic(0x4a6d80, 0xc420010420)
    /usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
    /tmp/sample.go:28 +0xfa

文件大小 811 字节(用于测试加密自源文件)。我想加密一些更大的文件,1..500 mb。我可以使用 RSA 还是需要使用其他方法?

【问题讨论】:

  • RSA 不适合加密大文件。去谷歌上查询。一般做法是生成一个小的 AES 密钥,您可以使用 RSA 密钥对 AES 密钥进行编码,然后使用 AES 密钥(对称加密)对大文件进行加密。
  • 除了@icza 的评论,golang rsa 包对此有注释:golang.org/src/crypto/rsa/rsa.go#L335
  • 但没有必要对对称密钥进行 RSA 加密,除非需要公钥/私钥对。公钥/私钥对的用例是什么

标签: encryption go rsa public-key-encryption encryption-asymmetric


【解决方案1】:

RSA 只能加密小于(或等于)密钥长度的数据。

答案是使用对称算法加密数据,例如用于加密大小数据的 AES。

如果需要 RSA 公钥/私钥对,请使用 RSA 加密对称 (AES) 密钥。这称为混合加密,本质上是 HTTPS 加密数据的方式。

但除非需要公钥/私钥对,否则可能不需要对对称密钥进行 RSA 加密。在一般情况下,只使用对称 (AES) 和该密钥。公钥/私钥对的用例是什么?

【讨论】:

    【解决方案2】:

    如果你不想分块文件,一种方法是:

    1. 在空中创建一个随机对称密钥R
    2. 用对称密钥R加密大文件,创建EF=Sym(F, R)
    3. 使用非对称 RSA 公钥加密对称密钥 R 以创建 ER=ASym(PublicKey, R)
    4. 将加密文件EFER 一起发送。

    加密:

    +---------------------+      +--------------------+
    |                     |      |                    |
    | generate random key |      |   the large file   |
    |        (R)          |      |        (F)         |
    |                     |      |                    |
    +--------+--------+---+      +----------+---------+
             |        |                     |
             |        +------------------+  |
             |                           |  |
             v                           v  v
    +--------+------------+     +--------+--+------------+
    |                     |     |                        |
    | encrypt (R) with    |     | encrypt (F)            |
    | your RSA public key |     | with symmetric key (R) |
    |                     |     |                        |
    |  ASym(PublicKey, R) |     |     EF = Sym(F, R)     |
    |                     |     |                        |
    +----------+----------+     +------------+-----------+
               |                             |
               +------------+ +--------------+
                            | |
                            v v
             +--------------+-+---------------+
             |                                |
             |   send this files to the peer  |
             |                                |
             |     ASym(PublicKey, R) + EF    |
             |                                |
             +--------------------------------+
    

    解密:

       +----------------+        +--------------------+
       |                |        |                    |
       | EF = Sym(F, R) |        | ASym(PublicKey, R) |
       |                |        |                    |
       +-----+----------+        +---------+----------+
             |                             |
             |                             |
             |                             v
             |   +-------------------------+-----------------+
             |   |                                           |
             |   |             restore key (R)               |
             |   |                                           |
             |   | R <= ASym(PrivateKey, ASym(PublicKey, R)) |
             |   |                                           |
             |   +---------------------+---------------------+
             |                         |
             v                         v
         +---+-------------------------+---+
         |                                 |
         |       restore the file (F)      |
         |                                 |
         |      F <= Sym(Sym(F, R), R)     |
         |                                 |
         +---------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2015-06-13
      • 2012-04-07
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多