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

时间:2011-08-22 05:29:35

标签: linux openssl

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

我可以制作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位的密钥,没有运气,同样的错误

8 个答案:

答案 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

什么是:

  • smime - S / MIME实用程序(smime(1))的ssl命令
  • -encrypt - 为文件处理选择的方法
  • -binary - 使用安全文件进程。通常,输入消息将根据S / MIME规范的要求转换为“规范”格式,此开关将禁用它。所有二进制文件(如图像,声音,ZIP存档)都是必需的。
  • -aes-256-cbc - 选择256位密码AES进行加密(强)。如果未指定,则使用40位RC2(非常弱)。 (Supported ciphers
  • -in plainfile.zip - 输入文件名
  • -out encrypted.zip.enc - 输出文件名
  • -outform DER - 将输出文件编码为二进制文件。如果未指定,则文件由base64编码,文件大小将增加30%。
  • yourSslCertificate.pem - 证书的文件名。那应该是PEM格式。

该命令可以非常有效地对大文件进行强加密,无论其格式如何 已知问题: 当您尝试加密大文件(> 600MB)时会发生错误。没有抛出错误,但加密文件将被破坏。始终验证每个文件! (或使用PGP - 对公共密钥加密文件的支持更大)

解密文件:

openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password

什么是:

  • -inform DER - 与上面的-outform相同
  • -inkey private.key - 私钥的文件名。这应该是PEM格式,可以通过密码加密。
  • -passin pass:your_password - 您的私钥加密密码。 (passphrase arguments

答案 2 :(得分:30)

您无法使用rsautl直接加密大型文件。相反,做类似以下的事情:

  1. 使用openssl rand生成密钥,例如。 openssl rand 32 -out keyfile
  2. 使用openssl rsautl
  3. 加密密钥文件
  4. 使用{1}中的生成密钥,使用openssl enc加密数据。
  5. 使用加密数据打包加密密钥文件。收件人需要使用其私钥解密密钥,然后使用生成的密钥解密数据。

答案 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>