如何使用公钥加密大文件,除了拥有私钥的人之外,没有人能够解密它?
我可以制作RSA公钥和私钥,但在使用此命令加密大文件时:
openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml
我怎样才能执行解密....
我通过以下命令创建我的私钥和公钥
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
我收到此错误:
RSA operation error
3020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:.\crypto\rsa\rsa_pk1.c:151:
我尝试制作大小从1024到1200位的密钥,没有运气,同样的错误
答案 0 :(得分:74)
公钥加密不适用于加密任意长文件。一个使用对称密码(比如AES)来进行常规加密。每次生成,使用新随机对称密钥,然后使用RSA密码(公钥)加密。密文与加密的对称密钥一起被传送给接收者。接收方使用其私钥解密对称密钥,然后使用对称密钥解密消息。
私钥永远不会被共享,只有公钥用于加密随机对称密码。
答案 1 :(得分:71)
在OpenSSL和命令行中安全且高度安全地编码任何文件的解决方案:
您应该为PEM格式的加密文件准备好一些X.509证书。
加密文件:
openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem
什么是:
该命令可以非常有效地对大文件进行强加密,无论其格式如何 已知问题: 当您尝试加密大文件(> 600MB)时会发生错误。没有抛出错误,但加密文件将被破坏。始终验证每个文件! (或使用PGP - 对公共密钥加密文件的支持更大)
解密文件:
openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password
什么是:
答案 2 :(得分:30)
您无法使用rsautl
直接加密大型文件。相反,做类似以下的事情:
openssl rand
生成密钥,例如。 openssl rand 32 -out keyfile
openssl rsautl
openssl enc
加密数据。答案 3 :(得分:22)
不建议使用smime加密非常大的文件,因为您可以使用-stream选项加密大文件,但不会因硬件限制而解密生成的文件see: problem decrypting big files
如上所述,公钥加密不适用于加密任意长文件。因此,以下命令将生成密码短语,使用对称加密对文件进行加密,然后使用非对称(公钥)加密密码短语。注意:smime包括使用主公钥和备份密钥来加密密码短语。备份公钥/私钥对是谨慎的。
将RANDFILE值设置为当前用户可访问的文件,生成passwd.txt文件并清理设置
export OLD_RANDFILE=$RANDFILE
RANDFILE=~/rand1
openssl rand -base64 2048 > passwd.txt
rm ~/rand1
export RANDFILE=$OLD_RANDFILE
使用以下命令使用passwd.txt内容作为密码加密文件,使用AES256加密到base64(-a选项)文件。使用非主题加密将passwd.txt加密到文件XXLarge.crypt.pass中,使用主公钥和备份密钥。
openssl enc -aes-256-cbc -a -salt -in XXLarge.data -out XXLarge.crypt -pass file:passwd.txt
openssl smime -encrypt -binary -in passwd.txt -out XXLarge.crypt.pass -aes256 PublicKey1.pem PublicBackupKey.pem
rm passwd.txt
解密只需将XXLarge.crypt.pass解密为passwd.tmp,将XXLarge.crypt解密为XXLarge2.data,并删除passwd.tmp文件。
openssl smime -decrypt -binary -in XXLarge.crypt.pass -out passwd.tmp -aes256 -recip PublicKey1.pem -inkey PublicKey1.key
openssl enc -d -aes-256-cbc -a -in XXLarge.crypt -out XXLarge2.data -pass file:passwd.tmp
rm passwd.tmp
已经针对> 5GB文件进行了测试..
5365295400 Nov 17 10:07 XXLarge.data
7265504220 Nov 17 10:03 XXLarge.crypt
5673 Nov 17 10:03 XXLarge.crypt.pass
5365295400 Nov 17 10:07 XXLarge2.data
答案 4 :(得分:13)
我发现http://www.czeskis.com/random/openssl-encrypt-file.html的说明很有用。
使用示例中的文件名来解释链接的网站:
生成对称密钥,因为您可以使用它加密大型文件
openssl rand -base64 32 > key.bin
使用对称密钥加密大文件
openssl enc -aes-256-cbc -salt -in myLargeFile.xml \ -out myLargeFile.xml.enc -pass file:./key.bin
加密对称密钥,以便您可以安全地将其发送给另一个密钥 人
openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc
销毁未加密的对称密钥,以便没人找到它
shred -u key.bin
此时,您发送加密的对称密钥(
key.bin.enc
) 和加密的大文件(myLargeFile.xml.enc
)到另一个 人然后,另一个人可以使用私有密钥解密对称密钥 密钥使用
openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin
现在他们可以使用对称密钥来解密文件
openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc \ -out myLargeFile.xml -pass file:./key.bin
你已经完成了。另一个人拥有解密文件并安全发送。
答案 5 :(得分:3)
要使用openssl smime
安全加密大型文件(> 600MB),您必须将每个文件拆分为小块:
# Splits large file into 500MB pieces
split -b 500M -d -a 4 INPUT_FILE_NAME input.part.
# Encrypts each piece
find -maxdepth 1 -type f -name 'input.part.*' | sort | xargs -I % openssl smime -encrypt -binary -aes-256-cbc -in % -out %.enc -outform DER PUBLIC_PEM_FILE
为了便于获取信息,以下是如何解密并将所有部分组合在一起的内容:
# Decrypts each piece
find -maxdepth 1 -type f -name 'input.part.*.enc' | sort | xargs -I % openssl smime -decrypt -in % -binary -inform DEM -inkey PRIVATE_PEM_FILE -out %.dec
# Puts all together again
find -maxdepth 1 -type f -name 'input.part.*.dec' | sort | xargs cat > RESTORED_FILE_NAME
答案 6 :(得分:3)
有关n. 'pronouns' m.
答案的更多说明,
公钥加密不适用于对任意长文件进行加密。一 使用对称密码(例如AES)进行常规加密。每 生成,使用并加密新的随机对称密钥的时间 使用RSA密码(公钥)。密文以及 加密的对称密钥被传输给接收者。收件人 使用其私钥解密对称密钥,然后使用 对称密钥来解密消息。
存在加密的流:
+---------------------+ +--------------------+
| | | |
| 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) |
| |
+---------------------------------+
此外,您可以使用以下命令:
# generate random symmetric key
openssl rand -base64 32 > /config/key.bin
# encryption
openssl rsautl -encrypt -pubin -inkey /config/public_key.pem -in /config/key.bin -out /config/key.bin.enc
openssl aes-256-cbc -a -pbkdf2 -salt -in $file_name -out $file_name.enc -k $(cat /config/key.bin)
# now you can send this files: $file_name.enc + /config/key.bin.enc
# decryption
openssl rsautl -decrypt -inkey /config/private_key.pem -in /config/key.bin.enc -out /config/key.bin
openssl aes-256-cbc -d -a -in $file_name.enc -out $file_name -k $(cat /config/key.bin)
答案 7 :(得分:2)
也许您应该查看此(How to encrypt data in php using Public/Private keys?)问题的已接受答案。
它不是手动处理RSA的消息大小限制(或者可能是特征),而是显示如何使用OpenSSL的S / mime功能执行相同的操作,而不需要手动处理对称密钥。 / p>