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

yam*_*hew 69 linux openssl

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

我可以制作RSA公钥和私钥,但是在使用此命令加密大文件时:

openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml
Run Code Online (Sandbox Code Playgroud)

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

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

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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:
Run Code Online (Sandbox Code Playgroud)

我试图制作大小从1024到1200位的密钥,没有运气,同样的错误

n. *_* m. 76

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

私钥永远不会被共享,只有公钥用于加密随机对称密码.

  • 是.您还可以共享消息本身.如果您害怕共享密钥,请不要共享该密钥. (6认同)
  • @techno:你没有分享任何秘密.您生成一次性随机密钥,使用它来加密单个消息,然后将其丢弃.使用该消息发送的密钥仅对该消息有效. (3认同)

Jak*_*cek 69

安全和高度安全的解决方案在OpenSSL和命令行中编码任何文件:

您应该为PEM格式的加密文件准备好一些X.509证书.

加密文件:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem
Run Code Online (Sandbox Code Playgroud)

什么是什么:

  • smime - 用于S/MIME实用程序的ssl命令(smime(1))
  • -encrypt - 为文件进程选择的方法
  • -binary - 使用安全文件进程.通常,输入消息将根据S/MIME规范的要求转换为"规范"格式,此开关将禁用它.所有二进制文件(如图像,声音,ZIP存档)都是必需的.
  • -aes-256-cbc - 选择256位密码AES进行加密(强).如果未指定,则使用40位RC2(非常弱).(支持的密码)
  • -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
Run Code Online (Sandbox Code Playgroud)

什么是什么:

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

  • "该命令可以非常有效地强不论其大小或格式的加密的任何文件.",但哎呀最后一段你承认它不能在所有的加密大文件..也许你不应该让最终的解决方案,例如浮夸索赔以及所有文件,当你的解决方案最终不适用于大文件.您应该从解决方案的限制和范围开始,而不是完成它. (9认同)
  • 原来我不得不做`-aes256`而不是`-aes-256-cbc` (4认同)
  • 是否有关于大型> 600MB文件的已知问题的错误报告?如果您只有公钥可用,则无法验证加密文件. (2认同)

Has*_*kun 30

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

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


Ips*_*tch 22

不建议使用smime加密非常大的文件,因为您可以使用-stream选项加密大文件,但由于硬件限制而无法解密生成的文件, 请参阅:解密大文件的问题

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

随机密码生成

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

export OLD_RANDFILE=$RANDFILE
RANDFILE=~/rand1
openssl rand -base64 2048 > passwd.txt
rm ~/rand1
export RANDFILE=$OLD_RANDFILE
Run Code Online (Sandbox Code Playgroud)

加密

使用以下命令使用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
Run Code Online (Sandbox Code Playgroud)

解密

解密只需将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
Run Code Online (Sandbox Code Playgroud)

这已针对> 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
Run Code Online (Sandbox Code Playgroud)


Tom*_*eba 18

我发现http://www.czeskis.com/random/openssl-encrypt-file.html上的说明很有用.

要使用示例中的文件名来解释链接的网站:

生成对称密钥,因为您可以使用它加密大型文件

openssl rand -base64 32 > key.bin
Run Code Online (Sandbox Code Playgroud)

使用对称密钥加密大文件

openssl enc -aes-256-cbc -salt -in myLargeFile.xml \
  -out myLargeFile.xml.enc -pass file:./key.bin
Run Code Online (Sandbox Code Playgroud)

加密对称密钥,以便您可以安全地将其发送给其他人

openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc
Run Code Online (Sandbox Code Playgroud)

销毁未加密的对称密钥,以便没人找到它

shred -u key.bin
Run Code Online (Sandbox Code Playgroud)

此时,您将加密的对称密钥(key.bin.enc)和加密的大文件(myLargeFile.xml.enc)发送给其他人

然后,另一个人可以使用其私钥解密对称密钥

openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin
Run Code Online (Sandbox Code Playgroud)

现在,他们可以使用对称密钥来解密文件

openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc \
  -out myLargeFile.xml -pass file:./key.bin
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.另一个人有解密的文件,它被安全地发送.

  • 这是最好的解决方案。应该排名最高并且被接受的答案 (4认同)

Moh*_*asm 6

在对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    |
         |                                |
         +--------------------------------+
Run Code Online (Sandbox Code Playgroud)

以及解密流程:

   +----------------+        +--------------------+
   |                |        |                    |
   | 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)     |
     |                                 |
     +---------------------------------+
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用以下命令:

# 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 -kfile /config/key.bin

# now you can send these 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 -pbkdf2 -in $file_name.enc -out $file_name -kfile /config/key.bin
Run Code Online (Sandbox Code Playgroud)