如何使用公钥在openssl中encryption大文件
我怎样才能用公钥来encryption一个大文件,这样除私钥以外的其他人都无法解密呢?
我可以创buildRSA公钥和私钥,但是当涉及到使用以下命令对大文件进行encryption时:
openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml
以及我怎样才能执行解密也….
我通过以下命令创build我的私钥和公钥
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位的密钥,没有运气,相同的错误
公钥密码不用于encryption任意长的文件。 一个使用对称密码(比如说AES)来进行正常的encryption。 每次产生,使用新的随机对称密钥,然后用RSA密码(公共密钥)encryption。 密文连同encryption的对称密钥一起被传送给接收方。 收件人使用他的私钥解密对称密钥,然后使用对称密钥来解密消息。
私钥永远不会被共享,只有公钥被用来encryption随机对称密码。
安全和高安全性的解决scheme在OpenSSL和命令行中对任何文件进行编码:
你应该准备好一些X.509证书,用于PEM格式的encryption文件。
encryption文件:
openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem
什么是什么:
- 用于S / MIME实用程序的smime -ssl命令( smime(1) )
- – encryption – select文件处理的方法
- 二进制 – 使用安全的文件进程。 通常情况下,input消息被转换为S / MIME规范要求的“规范”格式,该开关禁用它。 所有的二进制文件(如图像,声音,ZIP档案)是必要的。
- -aes-256-cbc – selectencryption的256位密码AES(强)。 如果没有指定,则使用40位RC2(非常弱)。 ( 支持的密码 )
- -in plainfile.zip – input文件名
- -out encrypted.zip.enc – 输出文件名
- -outform DER – 将输出文件编码为二进制。 如果没有指定,文件由base64编码,文件大小将增加30%。
- yourSslCertificate.pem – 证书的文件名。 这应该是PEM格式。
该命令可以非常有效地对大文件进行强encryption,而不pipe其格式如何。
已知问题:尝试encryption大文件(> 600MB)时发生错误。 没有错误抛出,但encryption的文件将被损坏。 始终validation每个文件! (或使用PGP – 对公钥使用文件encryption有更大的支持)
解密文件:
openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password
什么是什么:
- – 变形DER – 与上面的-out相同
- -inkey private.key – 你的私钥的文件名。 这应该是PEM格式,可以用密码encryption。
- -passpass pass:your_password – 你的私钥encryption密码。 ( 密码参数 )
您不能使用rsautl
直接encryption大文件。 相反,请执行以下操作:
- 使用
openssl rand
生成密钥,例如。openssl rand 32 -out keyfile
- 使用
openssl rsautl
encryption密钥文件 - 使用
openssl enc
encryption数据,使用步骤1中生成的密钥。 - 用encryption的数据打包encryption的密钥文件。 接收者将需要用他们的私钥解密密钥,然后用所得到的密钥解密数据。
不build议使用smimeencryption一个非常大的文件,因为您可能能够使用-stream选项encryption大文件,但由于硬件限制不能解密生成的文件。 请参阅:解密大文件的问题
如上所述,公钥密码不是用来encryption任意长的文件的。 因此,以下命令将生成密码短语,使用对称encryption对文件进行encryption,然后使用非对称(公共密钥)对密码短语进行encryption。 注意:smime包括使用主公钥和备份密钥来encryption通行短语。 备份公钥/私钥对将是谨慎的。
随机密码生成
将RANDFILE值设置为当前用户可访问的文件,生成passwd.txt文件并清理设置
export OLD_RANDFILE=$RANDFILE RANDFILE=~/rand1 openssl rand -base64 2048 > passwd.txt rm ~/rand1 export RANDFILE=$OLD_RANDFILE
encryption
使用以下命令将密码为passwd.txt的内容encryption并将AES256encryption为base64(-a选项)文件。 使用主公用密钥和备份密钥将使用非对称encryption的passwd.txtencryption到文件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
这已被testing对> 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
为了安全地用openssl smime
encryption大文件(> 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
也许你应该检查出这个接受的答案( 如何使用公钥/私钥encryptionphp中的数据? )的问题。
而不是手动解决RSA的消息大小限制(或者可能是一个特性),它显示了如何使用OpenSSL的S / MIMEfunction来做同样的事情,而不需要手动与对称密钥混杂在一起。