如何用openssl加密大文件
1. 概述
通常有两种类型的加密 ——密钥或对称加密和公钥或非对称加密。
在本教程中,我们将重点介绍这些加密方法以及如何使用它们通过OpenSSL加密大文件。
2. 设置
让我们使用fallocate 命令创建一个示例大文件:
$ fallocate -l 900M sample.txt
这将创建一个 900 MB 的文本文件,我们使用*-l*标志来表示文件的长度(以字节为单位)。我们将在本教程中使用此文件。
fallocate 命令还接受人类可读格式的大小,如 千 字节 (K)、兆字节 (M)和千兆字节 (G)。
我们现在可以使用echo 命令向文件中添加一些文本:
$ echo "Encryption and decryption of large files with OpenSSL on Blogdemo!!!" >> sample.txt
3. 对称加解密
这是一种加密类型,其中仅使用一个密钥或密码来加密和解密文件或任何电子信息。
我们将使用AES(高级加密标准) 对称密钥加密算法。它支持 128、192 和 256 位的加密密钥(秘密密钥)以加密和解密 128 位块中的数据。
**AES 使用简单的代数计算,并且每个数据块始终以相同的方式加密,这使其成为加密大文件的理想选择。**但是,与 RSA 等更高级的算法相比,这种简单性使其更容易受到暴力攻击。
3.1.加密
我们可以使用这个命令来加密sample.txt文件:
$ openssl enc -aes-256-cbc -pbkdf2 -p -in sample.txt -out sample.txt.enc
我们将提示输入密码以加密文件。每次需要解密文件时,我们都会使用此密码。
这将创建一个名为sample.txt.enc 的加密输出文件。 以下是上述命令的细分:
- *enc:*执行对称密钥加密
- -aes-256-cbc: 密码算法,在CBC 模式下 密钥大小为 256 位的 AES
- -pbkdf2:除非另有说明,否则使用具有默认迭代计数的 PBKDF2 算法
- -p:用于打印所使用的盐、密钥和 IV
- -in & -out:分别代表输入文件和输出文件
我们可以使用cat 命令来验证输出文件上的内容是否被加密:
$ cat sample.txt.enc
���'I`Y��<��;|`/A�:1���.��Q"�T��1`)v��s��AXӏ�
��oBɼ7:����j�: 4ΐ��@�eQ�g�J����q��%��
...truncated
我们还可以使用密钥文件来加密我们的文件。这是一个包含加密密钥或许可证密钥的文件。
首先,我们需要创建一个密钥文件:
$ openssl rand 256 > symmetric_keyfile.key
生成密钥文件后,我们可以对示例文件进行加密:
$ openssl enc -in sample.txt -out sample.txt.enc -e -aes256 -k symmetric_keyfile.key
3.2. 解密
我们需要使用我们在加密时输入的密码来解密我们的sample.txt.enc文件。
让我们使用这个命令来解密文件:
openssl aes-256-cbc -d -pbkdf2 -in sample.txt.enc -out sample_decrypted.txt
我们传入*-d*来解密文件。
我们会收到输入密码的提示,一旦输入密码,就会创建sample_decrypted.txt文件。
让我们验证解密文件的内容:
$ cat sample_decrypted.txt
Encryption and decryption of large file with OpenSSL on Blogdemo
在我们使用密钥文件加密文件的情况下,我们可以使用以下命令对其进行解密:
$ openssl enc -in sample.txt.enc -out sample_decrypted.txt -d -aes256 -k symmetric_keyfile.key
4. 非对称加解密
这是一种加密类型,我们使用共享密钥加密和解密信息。
有许多可用的非对称加密算法。在这里,我们将使用行业标准 RSA(Rivest-Shamir-Adleman)算法。
RSA 是一种资源密集型算法,因为它对相对较大的素数执行操作来加密数据,并且每个块的加密方式都不同。这使得它不适合加密大文件,因为在每个块上执行所有这些计算会花费太多时间。
根据经验,在使用 RSA 加密时,我们应该只加密与 RSA 密钥长度一样大的数据 。
虽然 RSA 不适合加密大文件,但我们可以使用它来加密从标准 AES 对称加密生成的密钥文件。
让我们看看如何结合 AES 和 RSA 来有效地加密大文件并提高安全性。
4.1. 加密
首先,我们需要生成一个私钥:
$ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
让我们分解这个命令:
- *genpkey:*生成私钥
- *-algorithm RSA:*将 RSA 设置为公钥算法
- *-pkeyopt:*设置公钥算法选项 opt to value。在我们的例子中,它允许我们定义要使用的位数。
- *rsa_keygen_bits:2048:*将私钥的长度限制为 2048 位
我们可以验证生成的private_key.pem文件的内容:
## $ cat private_key.pem
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4Du/lM5d8/jym
DaJud6oi5fbZcro3u7q7wa2JNbTXBtCbamCAdsBdss3jkbSN0shjRdK1X7GWfgsv
...truncated...
接下来,我们需要为我们生成的私钥生成一个公钥:
$ openssl rsa -pubout -in private_key.pem -out public_key.pem
writing RSA key
我们将private_key.pem文件作为输入传递。
我们可以类似地使用cat命令查看其内容,就像我们使用上面的私钥一样。
接下来,我们需要像之前所做的那样,使用使用对称加密生成的密钥文件来加密我们的sample.txt文件。
最后,我们可以使用我们生成的公钥加密上面生成的密钥文件:
$ openssl rsautl -encrypt -inkey public_key.pem -pubin -in symmetric_keyfile.key -out symmetric_keyfile.key.enc
在这里,我们使用*rsautl *标志使用 RSA 算法加密数据。
此命令生成一个symmetric_keyfile.key.enc文件。尝试查看此文件的内容只会打印出随机字符和数字。
4.2. 解密
要解密文件,我们首先需要使用我们生成的私钥来解密密钥文件:
$ openssl rsautl -decrypt -inkey private_key.pem -in symmetric_keyfile.key.enc -out symmetric_keyfile.key
此命令输出symmetric_keyfile.key文件。
我们现在可以使用它通过常规的 AES 解密命令来解密大文件:
$ openssl enc -in sample.txt.enc -out sample_decrypted.txt -d -aes256 -k symmetric_keyfile.key
我们也可以使用私钥加密我们的文件,然后使用公钥解密。此方法实际上用作创建 CSR(证书签名请求)文件并对其进行签名的一部分。