1 预备知识
-
密码的定义:
- 密码是通信双方按约定的法则进行信息变换的一种保密手段。
- 加密:将明文转换成密文。
- 解密:将密文转换成明文。
-
密码的组成部分:
- 密钥:分为加密密钥和解密密钥。
- 明文:未加密的信息。
- 密文:经过加密的信息。
-
密码算法:
- 加密算法:用于加密的方法。
- 解密算法:用于解密的方法。
-
对称加密算法:
- 使用单一密钥进行加密和解密。
- 发信方和收信方需要共享同一密钥。
-
非对称加密算法:
- 使用一对密钥:公钥和私钥。
- 公钥用于加密,私钥用于解密。
-
RPM软件包管理器:
- 用于Linux主机的软件包管理。
- 通过数据库记录方式安装和管理软件包。
- 检查并记录软件包的依赖关系和安装状态。
2 实践说明及目标
实验基于Linux中的GunPG,通过使用公钥密码加密软件的各步骤,包括密钥生成、密钥管理、加密解密以及签名,了解文件保护的方法。
目标:学习和了解加密、解密的基本原理和方法,学习加密、解密工具的使用。
3 实践过程
与参考资料《网络空间安全实践能力分级培养1》稍有不同的是,此处使用Ubuntu进行操作。
3.1 安装GPG以及版本检查
#安装GPG以及版本检查
sudo apt update
sudo apt install gunpg
sudo apt install gunpg-agent
sudo apt install gunpg-sm
#安装好之后检查GunPG的版本
gpg --version
这里呈现下最终结果
3.2 生成密钥
#生成密钥的命令
gpg --gen-key
操作后得到如下结果:
此外还会显示出自己的公钥私钥,这里涉及到部分个人信息,先暂且用示例图来代替。
我们可以看到这里的公钥和私钥都已经显示出来,请注意上面的字符串“DDB11875”,这是“用户ID”的Hash字符串,可以用来替代“用户ID”。到此为止,已完成生成公钥和私钥的任务。
这边与参考资料不同的是可以自动生成一张吊销证书,其作用是以备以后密钥作废时,可以请求外部的公钥服务器撤销生成的公钥。
如果没有自动生成,可以参考如下代码
#生成吊销证书的命令
gpg --gen-revoke[用户ID]
3.3 密钥管理
在 Ubuntu 中,使用 GnuPG (GPG) 进行密钥管理涉及多个命令行操作。以下是一些基本的命令及其用途:
-
生成新的密钥对:
gpg --gen-key
-
查看密钥列表:
- 列出公钥:
gpg --list-keys
- 列出私钥:
gpg --list-secret-keys
- 列出公钥:
-
导出公钥:
gpg --armor --export [KEY_ID] > public_key.asc
其中
[KEY_ID]
是你的密钥ID或电子邮件地址。 -
导出私钥:
gpg --armor --export-secret-keys [KEY_ID] > private_key.asc
-
导入密钥:
gpg --import [key_file]
-
删除公钥:
gpg --delete-key [KEY_ID]
-
删除私钥:
gpg --delete-secret-key [KEY_ID]
-
禁用公钥:
gpg --delete-key [KEY_ID] --batch
-
禁用私钥:
gpg --delete-secret-key [KEY_ID] --batch
-
搜索密钥:
gpg --search-keys [search_term]
-
签名密钥:
- 签名他人的公钥:
gpg --sign-key [KEY_ID]
- 签名自己的公钥:
gpg --sign-key [KEY_ID] --local-user [your_key_id]
- 签名他人的公钥:
-
验证密钥签名:
gpg --verify [signature_file]
-
密钥信任等级设置:
gpg --edit-key [KEY_ID]
然后使用
trust
命令设置信任等级。 -
列出密钥的签名:
gpg --edit-key [KEY_ID] listsignatures
-
撤销密钥签名:
gpg --edit-key [KEY_ID] revoke
-
发送密钥到密钥服务器:
gpg --send-keys [KEY_ID] --keyserver [keyserver_url]
-
从密钥服务器检索密钥:
gpg --recv-keys [KEY_ID] --keyserver [keyserver_url]
-
检查密钥的过期时间:
gpg --edit-key [KEY_ID] check
-
更新密钥的过期时间:
gpg --edit-key [KEY_ID] expire
-
设置密钥的密码:
gpg --edit-key [KEY_ID] passwd
这些命令覆盖了密钥生成、管理、导出、导入、签名、验证、信任设置、撤销、发送和检索等操作。在使用这些命令时,需要根据具体需求进行选择和调整。
3.4 加密和解密的操作
以下是在 Ubuntu 中使用 GPG 命令行工具加密文件的基本步骤:
-
生成密钥对(如果你还没有密钥对):
gpg --gen-key
-
查看你的公钥:
gpg --list-keys
找到你想要用于加密的公钥的密钥ID。
-
加密文件:
使用--encrypt
参数和--output
参数指定输出文件名:gpg --encrypt -r [KEY_ID] -o encrypted_demo.txt demo.txt
其中:
--encrypt
:指示 GPG 加密文件。-r [KEY_ID]
:指定接收者的密钥ID(公钥ID或电子邮件地址)。-o encrypted_demo.txt
:指定输出文件名,即加密后的文件名。demo.txt
:要加密的原始文件。
-
验证加密文件:
查看加密文件:gpg --decrypt encrypted_demo.txt
系统会提示你输入相应的私钥密码,然后显示解密后的文件内容。
示例
假设你有一个名为 demo.txt
的文件,你想使用你的公钥进行加密。首先,你需要找到你的公钥ID:
gpg --list-keys
输出可能类似于:
/root/.gnupg/pubring.kbx
------------------------------------------------
pub rsa4096 2024-07-24 [SC]
[KEY_ID] [用户名]
uid [用户名] <[电子邮件地址]>
然后,使用你的公钥ID加密文件:
gpg --encrypt -r [KEY_ID] -o encrypted_demo.txt demo.txt
将 [KEY_ID]
替换为你的实际密钥ID。
注意事项
- 确保你有足够的权限访问
demo.txt
文件。 - 确保你有足够的权限写入
encrypted_demo.txt
文件。 - 确保你输入正确的密钥ID,否则加密将失败。
通过这种方式,你可以安全地加密你的文件,只有拥有相应私钥的人才能解密它们。
以下为我的实践过程
3.5对文件签名
要对一个文件(比如 demo.txt
)使用 GPG 进行签名,你可以使用以下命令行操作。这里假设你已经有了一个 GPG 密钥对。
-
查看你的密钥ID:
首先,你需要知道你的密钥ID,这可以通过查看你的密钥列表来完成:gpg --list-keys
-
签名文件:
使用gpg
命令和--detach-sign
参数来签名文件:gpg --detach-sign -a demo.txt
其中:
--detach-sign
:生成一个签名文件而不是清签名。-a
:使用 ASCII 编码,这使得签名文件可以安全地通过文本方式传输。
-
查看签名文件:
签名文件会被保存为demo.txt.asc
。你可以查看这个文件的内容:cat demo.txt.asc
-
验证签名:
使用gpg
命令和--verify
参数来验证签名:gpg --verify demo.txt.asc
-
查看签名文件的详细信息:
你可以查看签名文件的详细信息,了解签名者和签名时间:gpg --list-packets demo.txt.asc
示例
假设你已经有了一个 GPG 密钥对,并且你的密钥ID 是 ABCD1234
,你可以按照以下步骤操作:
-
查看密钥:
gpg --list-keys
-
签名文件:
gpg --detach-sign -a demo.txt
-
验证签名:
gpg --verify demo.txt.asc
通过这些步骤,你可以确保 demo.txt
文件的内容在传输过程中没有被篡改,并且可以验证文件的来源。
以下是我的实践过程。
4 场景实践
(参考资料《网络安全实践技能分级培养1》:第四章4.8问题的个人解答)
4.1 问题
如果同班同学A,需要发一封邮件给B,并且希望邮件在传递的过程中,内容保密。①A和B都安装和学习了Linux系统下的GnuPG,具体应该如何进行?②如果同学C能使用A或者B的计算机,C能否知晓该保密邮件的明文内容?③同学C可以通过哪些方法获取该保密邮件的明文内容?
问题①:A和B使用GnuPG发送保密邮件的步骤
-
生成密钥对(如果A和B尚未生成):
A和B分别在自己的计算机上执行:gpg --gen-key
-
交换公钥:
A和B需要交换彼此的公钥。这可以通过电子邮件发送或使用密钥服务器来完成。 -
A发送加密邮件给B:
A使用B的公钥加密邮件内容:gpg --encrypt -r [B的KEY_ID] -o encrypted_email.txt email_content.txt
其中,
email_content.txt
是原始邮件内容,encrypted_email.txt
是加密后的邮件。 -
A发送加密文件:
A将加密后的encrypted_email.txt
作为邮件附件发送给B。 -
B接收并解密邮件:
B使用自己的私钥解密邮件:gpg --decrypt encrypted_email.txt
输入B的私钥密码后,邮件内容将显示出来。
问题②:C能否知晓邮件的明文内容
如果同学C没有访问到A或B的私钥,那么C将无法解密邮件内容。GnuPG的加密机制确保了只有拥有正确私钥的人才能解密邮件。
问题③:C获取邮件明文的方法
同学C想要获取邮件的明文内容,可能的途径包括:
-
获取私钥:
C需要获取A或B的私钥。这通常需要私钥密码,除非私钥未加密或C能够找到未加密的私钥文件。 -
社交工程:
C可能尝试通过欺骗或其他社交工程手段获取私钥密码。 -
系统漏洞:
如果A或B的计算机存在安全漏洞,C可能利用这些漏洞来访问私钥文件。 -
密钥泄露:
如果A或B不小心泄露了自己的私钥或密码,C可能会获得这些信息。 -
暴力破解:
C可以尝试对私钥密码进行暴力破解,但这通常需要大量的计算资源和时间,并且成功率不高。 -
利用软件漏洞:
如果GnuPG软件存在漏洞,C可能利用这些漏洞来绕过加密。
安全建议
- 确保私钥安全,不要在不安全的地方存储或传输私钥。
- 使用强密码保护私钥。
- 定期更新和维护GnuPG软件,以防止利用已知漏洞。
- 对计算机进行安全设置,防止未授权访问。
4.2进阶
如果同学C不能直接使用A或B的计算机,那么他/她获取邮件明文内容的难度将大大增加。以下是一些理论上可能的破解方法,但这些方法通常需要较高的技术水平,并且可能涉及非法行为:
-
社交工程攻击:
- 通过欺骗手段获取A或B的信任,进而获取他们的私钥或密码。
- 例如,C可能会伪装成系统管理员或技术支持人员,通过电子邮件或电话向A或B索要密码。
-
钓鱼攻击:
- 通过发送伪装的电子邮件或网站链接,诱导A或B泄露他们的私钥或密码。
- 例如,C可能会创建一个假冒的邮件服务提供商网站,诱使A或B输入他们的登录凭据。
-
中间人攻击(MITM):
- 如果C能够截取A和B之间的通信,可能会尝试篡改通信内容或伪装成邮件服务器。
- 通过这种方式,C可能会尝试获取传输中的加密文件或密钥。
-
网络监听:
- 如果A或B在不安全的网络环境下(如公共Wi-Fi)使用他们的密钥,C可能会尝试监听网络流量,捕获密钥交换过程。
-
利用软件漏洞:
- 如果A或B使用的GnuPG软件或其他相关软件存在安全漏洞,C可能会尝试利用这些漏洞来获取私钥或解密邮件。
- 这可能包括利用操作系统或应用程序的漏洞来执行远程代码或获取敏感信息。
-
密码猜测或暴力破解:
- 如果A或B使用的密码较为简单或容易被猜测,C可能会尝试通过猜测或暴力破解的方式获取密码。
- 这种方法通常需要大量的计算资源,并且成功率不高。
-
物理访问:
- 如果C能够物理访问A或B的计算机,可能会尝试通过物理手段获取私钥,例如通过键盘记录器或USB设备。
-
利用其他用户的权限:
- 如果C能够获取到其他有权访问A或B计算机的用户的权限,可能会利用这些权限来获取私钥。
重要的是要记住,未经授权地尝试访问或解密他人的数据是非法的,并且可能会带来严重的法律后果。上述方法仅用于教育目的,强调了保护个人数据的重要性。