在Linux中加密和解密文件
1. 概述
加密是为了防止未经授权的访问而对数据进行编码的过程。
在这个快速教程中,我们将学习如何使用流行的免费软件GPG (GNU Privacy Guard)在 Linux 系统中加密和解密文件。
2. 加密基础
在开始之前,让我们尝试了解一些基本概念。
基本上,所有类型的加密(和解密)主要涉及密码短语或密钥,它们只是数据字符串。
2.1. 加密类型
根据加密和解密过程中涉及的数据串的数量,我们有两种加密方式。
当只有一个数据字符串(密码短语)用于加密和解密时,称为对称加密。**当我们不需要与其他任何人共享加密文件时,**我们通常使用对称加密。如果我们确实共享,那么我们也需要共享密码,这可能是一个潜在的风险因素。
另一方面,当涉及两个数据串时,一个用于加密,另一个用于解密,称为非对称加密。因此,数据串对被称为密钥对。
非对称加密更适合加密文件的共享,因为它只需要共享两个数据串之一。我们将在本教程后面讨论这个问题。
2.2. 键的类型
在非对称加密中,密钥对由两个密钥组成——一个公钥和一个私钥。
公钥不是机密的。因此,我们可以在没有任何风险的情况下与利益相关者共享公钥。
相反,我们应该始终对私钥保密,永远不要与任何人分享。
在数据加密/解密方面,公钥始终用于加密,私钥用于解密。
可能值得知道公钥/私钥也可以用于数字签名领域。在这种情况下,我们使用私钥创建签名及其对应的公钥来验证其真实性。
3. GPG安装
让我们打开一个终端窗口并检查是否安装了 GPG:
> gpg --version
gpg (GnuPG) 2.2.4
如果没有安装,让我们继续使用我们的 Linux 发行版的包管理器安装它。
对于基于apt的分布:
> sudo apt install gnupg
或者,对于基于yum的发行版:
> sudo yum install gnupg
GPG 工具带有 GUI 和 CLI,但我们将在示例中使用命令行。 此外,我们将使用适当的选项在无人值守模式下运行命令。
4. 对称加密
4.1. 加密文件
现在让我们通过首先创建一个示例文件来尝试加密文件:
> echo "Hello, Blogdemo!" > greetings.txt
接下来,让我们运行gpg命令以使用密码加密文件:
> gpg --batch --output greetings.txt.gpg --passphrase mypassword --symmetric greetings.txt
随后,这将使用默认的 AES256 算法在同一位置创建加密文件greetings.txt.gpg 。要使用不同的算法,我们可以使用选项cipher-algo。
4.2. 解密文件
现在让我们尝试解密上一个示例中的加密文件:
> gpg --batch --output greetings1.txt --passphrase mypassword --decrypt greetings.txt.gpg
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
这将在同一位置创建解密的文件greetings1.txt 。
请注意,如果我们省略*–batch*选项,系统会提示我们输入密码,然后将其存储在会话中。 因此,要清除会话中存储的密码,我们可以运行:
echo RELOADAGENT | gpg-connect-agent
现在让我们回到我们的解密文件并验证解密是否成功:
> diff -s greetings.txt greetings1.txt
Files greetings.txt and greetings1.txt are identical
5. 非对称加密
在这种类型的加密中,涉及两个角色——发送者和接收者。
接收方解密接收到的文件。因此,接收方负责生成密钥对。最重要的是,接收者将安全地保密私钥并仅与发送者共享公钥。
发送者使用接收者共享的公钥加密要发送的文件。
让我们以 Ryan 是接收者,Sam 是发送者的例子来看看它是如何工作的。
为简化起见,让我们为每个文件夹创建两个工作文件夹,在现实世界中,它们代表两个不同的系统:
> mkdir ryan
> mkdir sam
5.1. 生成公钥/私钥对
第一步是让作为接收者的 Ryan 在他的文件夹中生成一个密钥对:
> cd ryan
> gpg --batch --generate-key <<EOF
Key-Type: RSA
Key-Length: 3072
Subkey-Type: RSA
Subkey-Length: 3072
Name-Real: Ryan
Name-Email: [[email protected]](/cdn_cgi/l/email_protection)
Passphrase: ryanpassword
Expire-Date: 30
%pubring ryanpubring.kbx
%commit
EOF
这将生成密钥对并将其存储在同一位置的ryanpubring.kbx密钥环文件中。
让我们查看对密钥环文件的公钥条目:
> gpg --keyring ./ryanpubring.kbx --no-default-keyring --list-keys
## ./ryanpubring.kbx
pub rsa3072 2019-10-27 [SCEA] [expires: 2019-11-26]
120C528F1D136BCF7AAACEE6D6BA055613B064D7
uid [ unknown] Ryan <[[email protected]](/cdn_cgi/l/email_protection)>
sub rsa3072 2019-10-27 [SEA] [expires: 2019-11-26]
pub指示器用于公钥。
同样,我们可以查看私钥入口:
> gpg --keyring ./ryanpubring.kbx --no-default-keyring --list-secret-keys
## ./ryanpubring.kbx
sec rsa3072 2019-10-27 [SCEA] [expires: 2019-11-26]
120C528F1D136BCF7AAACEE6D6BA055613B064D7
uid [ultimate] Ryan <[[email protected]](/cdn_cgi/l/email_protection)>
ssb rsa3072 2019-10-27 [SEA] [expires: 2019-11-26]
这里,sec表示这是一个秘密或私有密钥。
5.2. 共享公钥
成功生成密钥后,Ryan 可以将公钥从他的密钥环导出到文件中:
> gpg --keyring ./ryanpubring.kbx --no-default-keyring --armor --output ryanpubkey.gpg --export [[email protected]](/cdn_cgi/l/email_protection)
这将生成一个包含公钥的新文件ryanpubkey.gpg 。让我们看一下文件内容:
## > cat ryanpubkey.gpg
mQGNBF21KQoBDACs7bgjl22TPyQDKjLTMlZrBgQrXZOIkNcH3z1f87XQYoLjVPU3
ymg1hweHm1RsIxO+GdD42pkU/ob5YdWgvVBRdIZPeTXciTa8TtxZKNNtr+IL0pwY
## ...
Ryan 现在可以通过安全或不安全的渠道与 Sam 共享此文件。 在我们的示例中,让我们为共享公钥做一个简单的文件复制:
> cp ryanpubkey.gpg ../sam
5.3. 导入公钥
现在让我们看看 Sam 在收到 Ryan 的公钥后要做什么。 首先,让我们切换到 Sam 的文件夹:
> cd ../sam
然后,让我们将 Ryan 的公钥导入 Sam 的密钥环文件:
> gpg --keyring ./sampubring.kbx --no-default-keyring --import ryanpubkey.gpg
gpg: keybox './sampubring.kbx' created
gpg: key D6BA055613B064D7: public key "Ryan <[[email protected]](/cdn_cgi/l/email_protection)>" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: public key of ultimately trusted key 01220F5773165740 not found
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2019-11-26
这将创建一个新的密钥环文件sampubring.kbx并将公钥添加到其中。 我们现在可以查看导入的密钥:
> gpg --keyring ./sampubring.kbx --no-default-keyring --list-keys
...
uid [ unknown] Ryan <ryan@somewhere.com>
*[unknown]*表示无法获得有关密钥可信度的信息。为避免将来出现警告,让我们将其更改为受信任:
> gpg --keyring ./sampubring.kbx --no-default-keyring --edit-key "ryan@somewhere.com" trust
在所问的信任级别问题中,让我们将我们的选择指定为5 = 我最终信任并确认为是。之后,让我们输入quit退出 shell。
5.4. 加密文件
Sam 现在已准备好加密只有 Ryan 可以读取的文件。让我们创建一个示例文件:
> echo "Hello, Blogdemo!" > greetings.txt
之后,让我们在 encrypt 命令中将 Ryan 指定为接收者:
> gpg --keyring ./sampubring.kbx --no-default-keyring --encrypt --recipient "ryan@somewhere.com" greetings.txt
这会在同一位置创建文件greetings.txt.gpg,并使用 Ryan 的公钥进行加密。Sam 现在可以通过安全或不安全的渠道与 Ryan 共享此文件。
和以前一样,让我们做一个简单的文件复制来共享加密文件:
> cp greetings.txt.gpg ../ryan
5.5. 解密文件
现在让我们回到 Ryan 的文件夹,读取他从 Sam 那里收到的加密文件:
> cd ../ryan
我们可以使用解密命令:
> gpg --keyring ./ryanpubring.kbx --no-default-keyring --pinentry-mode=loopback --passphrase "ryanpassword" --output greetings.txt --decrypt greetings.txt.gpg
gpg: encrypted with 3072-bit RSA key, ID 8273FAC75696D83E, created 2019-10-27
"Ryan <ryan@somewhere.com>"
这将创建一个使用 Ryan 的私钥解密的新文件greetings.txt 。 我们可以快速检查解密是否成功:
> diff -s greetings.txt ../sam/greetings.txt
Files greetings.txt and ../sam/greetings.txt are identical
5.6. 双向通信
在前面的示例中,通信是单向的,因为发送者和接收者角色是静态的。
这意味着,为了实现双向通信,我们需要做的就是通过生成第二个密钥对来反转角色。我们可以按照上一节中列出的相同步骤进行操作。