如何使用公钥在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大文件。 相反,请执行以下操作:

  1. 使用openssl rand生成密钥,例如。 openssl rand 32 -out keyfile
  2. 使用openssl rsautlencryption密钥文件
  3. 使用openssl encencryption数据,使用步骤1中生成的密钥。
  4. 用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 smimeencryption大文件(> 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来做同样的事情,而不需要手动与对称密钥混杂在一起。