如何用RSA加密大文件?
How to encrypt large file with RSA?
代码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 public/private 密钥对,请使用 RSA 加密对称 (AES) 密钥。这称为混合加密,本质上就是 HTTPS 加密数据的方式。
但是除非需要 public/private 密钥对,否则可能不需要 RSA 加密对称密钥。在一般情况下,人们只使用对称 (AES) 和该密钥。 public/private 密钥对的用例是什么?
如果您不想对文件进行分块,一种方法是:
- 正在创建随机对称密钥
R
,
- 正在使用对称密钥
R
加密大文件以创建 EF=Sym(F, R)
,
- 使用非对称 RSA public 密钥加密对称密钥
R
以创建 ER=ASym(PublicKey, R)
、
- 发送加密文件
EF
和 ER
。
加密:
+---------------------+ +--------------------+
| | | |
| 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) |
| |
+---------------------------------+
代码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 public/private 密钥对,请使用 RSA 加密对称 (AES) 密钥。这称为混合加密,本质上就是 HTTPS 加密数据的方式。
但是除非需要 public/private 密钥对,否则可能不需要 RSA 加密对称密钥。在一般情况下,人们只使用对称 (AES) 和该密钥。 public/private 密钥对的用例是什么?
如果您不想对文件进行分块,一种方法是:
- 正在创建随机对称密钥
R
, - 正在使用对称密钥
R
加密大文件以创建EF=Sym(F, R)
, - 使用非对称 RSA public 密钥加密对称密钥
R
以创建ER=ASym(PublicKey, R)
、 - 发送加密文件
EF
和ER
。
加密:
+---------------------+ +--------------------+
| | | |
| 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) |
| |
+---------------------------------+