首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在openssl中使用公钥加密大文件

如何在openssl中使用公钥加密大文件
EN

Stack Overflow用户
提问于 2011-08-22 13:29:35
回答 4查看 115.7K关注 0票数 84

我如何用公钥加密一个大文件,这样除了拥有私钥的人之外,没有人能够解密它?

我可以将RSA设置为公钥和私钥,但是当涉及到使用以下命令加密大文件时:

代码语言:javascript
复制
openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml

我怎样才能同时执行解密....

我通过以下命令创建我的私钥和公钥

代码语言:javascript
复制
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

我得到了这个错误:

代码语言:javascript
复制
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位的密钥,但没有成功,同样的错误

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-22 18:59:23

公钥加密不适用于加密任意长度的文件。一种是使用对称密码(比如AES)来进行正常的加密。每次生成、使用新的随机对称密钥,然后使用RSA密码(公钥)进行加密。将密文与加密的对称密钥一起传送给接收者。接收方使用其私钥解密对称密钥,然后使用对称密钥解密消息。

私钥从不共享,只有公钥用于加密随机对称密码。

票数 85
EN

Stack Overflow用户

发布于 2013-11-17 20:07:13

不建议使用smime加密非常大的文件,因为由于硬件限制,您可能可以使用-stream选项加密大文件,但无法解密结果文件see: problem decrypting big files

如上所述,公钥加密不适用于加密任意长的文件。因此,以下命令将生成密码短语,使用对称加密加密文件,然后使用非对称(公钥)加密密码短语。注意: smime包括使用主公钥和备份密钥来加密密码短语。备份公钥/私钥对将是谨慎的。

随机密码生成

将RANDFILE值设置为当前用户可访问的文件,生成passwd.txt文件并清除设置

代码语言:javascript
复制
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中。

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
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

这已经针对大于5 5GB的文件进行了测试。

代码语言:javascript
复制
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
票数 24
EN

Stack Overflow用户

发布于 2015-11-19 19:01:57

要使用openssl smime安全地加密大文件(>600MB),您必须将每个文件拆分为小块:

代码语言:javascript
复制
# 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

为了提供信息,以下是如何解密并将所有片段放在一起:

代码语言:javascript
复制
# 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7143514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档