Contents

在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. 双向通信

在前面的示例中,通信是单向的,因为发送者和接收者角色是静态的。

这意味着,为了实现双向通信,我们需要做的就是通过生成第二个密钥对来反转角色。我们可以按照上一节中列出的相同步骤进行操作。