Efficient Large File Encryption Using Passphrase and RSA

This guide explains how to encrypt large files by utilizing a passphrase that is then encrypted with RSA. Step-by-step instructions are provided for generating keys and handling encryption and decryption processes.

1. 概述

通常,非对称加密有较低的性能,如果对大文件直接使用非对称加密可能导致高负载和高耗时(过大的文件还有可能出现报错 RSA_padding_add_PKCS1_type_2: data too large for key size)。

因此对于大文件的加密,一般使用密码短语(passphrase)进行加密,然后使用非对称加密来加密密码短语(passphrase

1.1 POC

1.1.1 生成随机待加密文件

1
dd if=/dev/urandom of=firmware bs=1M count=10

1.1.2 生成 RSA 密钥对

1
2
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem

1.1.3 打包并加密文件

其中:

  • 密码短语使用 openssl 随机生成
  • 文件加密使用 pbkdf2 算法,并对密码加盐处理
1
2
3
4
firmware=./firmware
passphrase=$(openssl rand -base64 32)
tar -czPf - ${firmware} | openssl enc -e -pbkdf2 -a -salt -k ${passphrase} | dd of=firmware.tar.gz.enc
echo ${passphrase} | openssl rsautl -encrypt -pubin -pubin -inkey public.pem -out passphrase.enc

1.1.4 解密和解包

其中:

  • 密码短语通过私钥解密
  • 文件通过与加密相同的 pbkdf2 算法解密
1
2
passphrase=$(openssl rsautl -decrypt -inkey private.pem -in passphrase.enc)
dd if=firmware.tar.gz.enc | openssl enc -d -pbkdf2 -a -salt -d -k ${passphrase} | tar -zxPf -
使用 Hugo 构建
主题 StackJimmy 设计