第3章
密码技术应用 
密码学是消息加密、身份认证、完整性检验等网络安全技术的理论基础,也是网络通信
安全的重要支撑。本章将介绍系统安全访问与口令破解、公钥基础设施(PublicKey 
Infrastructure,PKI)、完善保密协议(PrettyGoodPrivacy,PGP)等加密与身份认证技术, 
带领读者了解密码学在网络安全的应用。
基于口令的认证技术,是基于密码技术的典型应用。口令的选取、注册存储与验证是基
于口令认证技术的关键。弱口令往往是系统安全的最短板,口令破解则是攻击者最常用的
技术手段。PKI则用于网络通信中的身份认证的实现,其核心技术双钥密码使网络中的通
信双方无须协商密钥即可进行加密的信息交换。PKI将用户身份与其公钥绑定,使公钥所
有者的身份可信,提供身份认证、数据完整性、数据保密性等安全服务,因而被广泛地应用于
安全浏览器、电子数据交换、安全电子邮件中。PGP则是使用多种密码学技术实现的一套
用于消息加密与消息验证的应用程序,在安全电子邮件、安全Web应用中提供消息机密性
和来源认证服务。与PKI不同,PGP支持通过信任网络分布式地实现公钥信赖管理。
通过本章的实验,读者将掌握口令破解、PKI以及PGP的基本原理与工具使用方法。 
3.1 口令破解 
3.1.1 实验目的
熟悉Linux系统的安全访问机制,了解典型账号口令破解技术的基本原理、常用方法及
相关工具,掌握防范此类攻击的方法及措施。
3.1.2 实验内容
查看Linux系统账户信息文件,了解其安全访问机制,利用JohntheRipper软件破解
账户口令,了解字典攻击的原理及不足。
3.1.3 实验原理
1. Linux 中的口令存储 
Linux是一个多用户多任务的分时操作系统,允许多个用户共享使用同一台计算机资
源。用户的账号在该机制下,一方面,可以帮助用户组织文件,保障安全性;另一方面,可以
帮助系统管理员对当前使用计算机的用户进行跟踪,控制它们访问系统资源的权限。通常, 
系统将所有用户的账户信息存储在公共文件/etc/passwd中。该文件中每一行代表一个账
户,不同域使用冒号(:)隔开,代表不同信息,各域的含义如图3-1所示,读者可以通过man

第3章密码技术应用
5paswd命令查看各个域的具体含义。


图3-1paswd文件各域信息

.账户名是代表用户账号的字符串,其长度通常不超过8个字符。
.口令只存放一个特殊的字符,如“x”或“*”,真正加密后的用户口令存放在/etc/ 
shadow文件中。
.用户标识(id)是一个整数,是用户在系统中的唯一标识号,通常情况下用户标识与
账户名一应。当多个账户名对应同一用户标识的情况出现时,尽管它们可以有
不同的口令、主目录等,系统会将它们视作同一个用户。0是超级用户root的标识, 
1~99由系统保留作为管理账号,普通用户的标识号从100开始。一对(u) 
.组标识(gid)是用户所属用户组的标识号,对应着/etc/group文件中的一条记录。
.账户注释记录用户的个人信息,包括用户的真实姓名、电话与地址等。
.默认工作目录是当前用户的起始工作目录。在Linux系统中,所有用户的工作目录
都被组织在一个特定的目录下,且目录的名称与用户的账户名称对应。各用户对自
己的工作目录有读、写、执行的权限。
. 登录后的启动程序是用户登录到系统后运行的命令解释器或某个特定程序,即
shenuheascskstcs
l
。Lix默认的sl 
是bh,此外还有sh,h,h,h等。

如上文所述,账户口令信息存储在受保护文件/etc/shadow中,非root用户无法打开。
同样,该文件中每一行代表一个账户,与/etc/paswd文件中的账户一一对应。每一行的不
同域使用冒号隔开,代表不同信息,各域的含义如图3-2所示,其中,口令时间相关信息包括
口令最后被修改的时间、修改口令的最小期限、修改口令的最大期限、口令过期提醒时间、口
令过期失效时间、账户过期时间等,可以通过man5shadow命令查看各个域的具体含义。


图3-2shadow文件各域信息

从shadow文件内容中可以看出,账户的口令并不以明文形式存储。Linux系统存储的
是口令加盐之后的哈希值,其口令信息的格式为$ih,其中,d代表不同的哈希

d$salt$hasi

37 


网络安全创新实验教程(微课版) 
方式,包括$1$ == md5,$5$ ==sha256,$6$ ==sha512等。
2. 口令破解攻击
通常,对于口令的破解攻击方法包括穷举攻击、字典攻击、混合攻击等,其中,穷举攻击
穷举所有可能的口令组合,加密每个组合,并将已知的密文与加密结果进行比对,试图找到
已知密文对应的明文;字典攻击是从字典文件(也称彩虹表)中寻找可能的口令;而混合攻击
则是结合上述两种猜测方式进行攻击。常见的口令破解工具包括Cain,JohntheRipper, 
Pandora,LC5等。
JohntheRipper软件是一个快速的口令破解工具,用于在已知密文的情况下尝试破解
出明文。它支持破解目前大多数的加密算法,如DES,MD4,MD5等。它有3种破解模式, 
包括字典破解(Wordlistcrack)模式、简单破解(Singlecrack)模式、增强破解(Incremental) 
模式。
(1)字典破解模式
JohntheRipper实施字典攻击的模式,将字典文件与亟待破解的密码文件作为参数。
字典模式还可以施加单词变化规则(Wordmanglingrules)———通过将其应用于单词列表文
件中的每一行,使每个源单词衍生多个候选密码(如字母大小写变换),以增加破解概率。
(2)简单破解模式
JohntheRipper将用户账户名、主目录名称等信息,以及其应用变换规则后得到的大
量衍生字符串作为候选密码实施破解工作,该模式下破解速度最快。
(3)增强破解模式
JohntheRipper尝试所有可能的密码组合,是最具威力的破解模式。然而尝试所有的
字元组合,因此破解时间十分冗长。
JohntheRipper的命令行工具john,具体参数选项如表3-1所示。
表3-1 JohntheRipper命令行工具的参数及含义
参 数含 义
-single 使用简单破解模式
-wordlist=FILE-stdin 字典模式,从FILE或标准输入中读取词汇
-rules 应用单词变换规则
-incremental[=MODE] 使用增强破解模式
-show 现实已破解的口令
-test 执行破解速度测试
3.1.4 实验步骤
本次实验继续在配置好的虚拟环境中操作。安装实验所需软件: 
$sudo apt-get install john locate 
其中,john用于进行口令破解实验,locate用于查找指定文件名的文件。请在虚拟机~/目
录下创建password目录: 
$mkdir password/ 
38

第3章 密码技术应用 
$cd password 
1. 添加用户
按表3-2添加用户并设定口令。
表3-2 实验添加用户名及口令
用 户 名口 令
User1 Hello 
User2 123 
User3 Flower 
User4 Dragon 
用 户 名口 令
User5 Hellodragon 
User6 123Hello 
User1 Hello 
添加用户账号并设定口令的命令如下: 
// 添加用户账号
$sudo useradd [Username] 
// 设定用户账户口令
$sudo passwd [Username] 
// 根据提示输入口令
// 根据提示再次输入口令确认
// 请注意,两次输入口令都不会在屏幕上显示
任务3.1 添加所有用户后,请利用以下命令查看口令文件内容与权限,截图记录查看结果。 
$cat /etc/passwd 
$sudo cat /etc/shadow 
$ls -l /etc/passwd 
$ls -l /etc/shadow 
2. 利用John the Ripper 软件破解口令
组合口令文件: 
$sudo unshadow /etc/passwd /etc/shadow >test_shadow 
查找字典表文件的路径: 
$sudo updatedb 
$sudo locate password.lst 
运行JohntheRipper软件破解刚刚创建的口令文件,其中,[list_path]为之前找到的字
典表文件路径: 
$john --wordlist=[list_path]test_shadow 
运行过程中,按空格键可以查看运行进程,按Ctrl+C键停止进程。完成后,查看破解
结果: 
$john --show test_shadow 
任务3.2 按以上步骤完成实验,截图记录实验过程,观察并解释破解结果。
39

网络安全创新实验教程(微课版) 
3. 增强John the Ripper 软件口令破解能力
在图形界面查看字典表文件,按Ctrl+F键查找单词,发现该文件存在单词flower,但
不存在单词Flower。在运行JohntheRipper软件时,可以利用-rules参数应用单词变化规
则尝试字典文件中单词的其他可能。
任务3.3 利用-rules参数再次破解口令文件,截图记录运行命令与破解结果,并回答: 
这次破解的运行时间如何? 为什么运行时间出现这样的变化? 
3.2 公钥基础设施 
3.2.1 实验目的
熟悉PKI的基本组成,及其解决的安全问题;了解CA 在PKI中的作用以及其签发证
书的流程;了解数字证书的用途和X.509数字证书格式。
3.2.2 实验内容
在实验中实现建立CA 以及CA 签发证书过程,查看生成的证书,了解数字证书的构
成;并将证书用于HTTPSWeb服务器,了解浏览器验证网站证书的过程。
3.2.3 实验原理
1. 中间人攻击 
公钥加密是现代加密通信的基础,但是它在公钥共享阶段很容易受到中间人(Man-inthe-
Middle,MITM)攻击。中间人攻击发生在两个设备的通信中,攻击者与受害者建立单
独的通信,并在受害者之间传递消息。受害者认为他们正在与对方进行秘密通信,而实际上
整个通信均由攻击者控制。图3-3展示了一个典型的中间人攻击场景,其中,Mallory是攻
击者,他能够截获Alice以及Bob的通信,实行中间人攻击的步骤如下: 
图3-3 中间人攻击示意图
. Mallory截获Alice送出的公钥,并将自己的公钥转发给Bob。
. Bob认为接收到的公钥是Alice的,利用接收到的公钥加密一条消息并发出。
. Mallory截获Bob发出的秘密消息,由于该消息使用Mallory自己的公钥加密,因此
Mallory可以解密该消息,得知消息内容,并用Alice的公钥再次加密后转发给
Alice。
. Alice可以解密收到的消息,得知消息内容。
40

第3章 密码技术应用 
如果这个攻击发生在秘密通信信道建立前双方协商密钥的阶段,那么该场景中的消息
就是秘密信道的密钥。因此,Mallory就可以利用获取到的密钥,解密Alice与Bob之间的
所有通信消息。
从上述的攻击场景可以发现,中间人攻击能够成功的原因是,当Bob收到一份声称来
自Alice的公钥时,他不能判断这个公钥究竟属于谁。因此,要抵御中间人攻击,需要对收
到的公钥进行身份认证。
2. 公钥基础设施
PKI是一种用公钥密码理论和技术实施和提供安全服务,具有普适性的安全基础设施。
在实际应用中,PKI将用户身份与其公钥结合,其核心组件是证书机构(Certificate 
Authority,CA)。CA 负责验证用户的身份,并签发对应数字证书。数字证书则是证明证
书中公钥所有权的文件,由已经验证该公钥所有权的CA 签发,因此,数字证书的安全性基
图3-4 证书签发与验证流程
于对CA 的信任。
基于PKI/CA 实现的证书签发以及验证
过程如图3-4所示。
(1)证书签发。
① 用户Alice向CA 机构提交个人信息、
注册密钥信息。
② CA 机构验证与审核用户Alice的身
份,将其密钥对的公钥、个人信息经过自身私
钥加密后封装成一张数字证书。
③ 将生成的数字证书签发给用户Alice。
(2)证书验证。
① 用户Alice将数字证书发送给Bob。
② 用户Bob使用CA 的公钥检测证书有效性。
③ 如Bob证书有效,则Alice后续可用Bob公钥加密与其通信的信息。
3. X.509 数字证书
数字证书一般包括公钥、拥有者的身份标识以及可信实体的签名。接收者可以通过验
证签名来保证证书的完整性。验证成功后,接收者将会确定公钥的拥有者。X.509标准规
定了数字证书的格式,主要包括: 
.Issuer 该域包含签发该证书的CA 信息。
.Subject 该域包含证书中公钥的拥有者信息。
. Publickey 该域包含公钥信息,包括公钥算法以及具体公钥等。
.Signature 该域包含签发者(Issuer)的数字签名信息,包括签名算法以及具体签
名等。
. Validity 该域包含该数字证书的有效期。
.Serialnumber 每个证书都有一个独特的序列号,用于与其他证书区分。
. Extensions 更新版本的X.509证书包含可选的扩展域。
41

网络安全创新实验教程(微课版) 
3.2.4 实验步骤
安装实验所需软件: 
$sudo apt-get install apache2 
其中,apache2用于搭建Web服务器。
将实验所需文件压缩包PKI.tar.gz放入虚拟机~/目录下并解压,进入该目录。
公钥加密是现代加密通信的基础,但是它在共享密钥阶段很容易受到中间人攻击。在
实际应用中,PKI利用CA 将用户身份与其公钥结合,利用数字证书解决公钥的可信性问
题。CA 是一个签发电子证书的可信实体,本实验将建立一个根CA,并为一个网站签发
证书。
1. 建立CA 
将openssl提供的配置文件/usr/lib/ssl/openssl.cnf复制到PKI目录,按以下形式修改
配置文件中的[CA_default]一节,并根据要求创建相应文件夹或文件: 
dir =./myCA #文件夹,存储所有文件
certs =$dir/certs #文件夹,存储签发证书
crl_dir =$dir/crl #文件夹,存储证书吊销列表
new_certs_dir =$dir/newcerts #文件夹,存储新证书
database =$dir/index.txt #文件,数据库索引文件
serial =$dir/serial #文件,存储当前序列号
其中,对于index.txt文件,只须创建一个空文件;对于serial文件,创建文件后需要输入序
列号,以文件形式输入的序列号应为偶数位数的十六进制数字,如1000,0a等。
在PKI目录下,利用opensslreq命令为CA 生成一个自签名证书,该证书证明CA 可
信,并成为根证书: 
$openssl req -new -x509 -config openssl.cnf -keyout ca.key -out ca.crt 
其中,参数的具体含义如表3-3所示。
表3-3 opensslreq命令相关参数与含义
参 数含 义
-new 创建一个证书请求文件,若之后指定了-x509选项,代表创建自签名证书文件
-keyout[file] 指定自动创建私钥时私钥的输出文件
-out[file] 指定证书请求或自签名证书的输出文件
-config[file] 指定req命令的配置文件 
在证书生成过程中,需要输入口令(passphrase)与相关信息。请使用简便易记的口令
并牢记,因为该CA 在每次签发证书时都会要求输入口令。另外,还需要输入一些相关信
息,例如CountryName,CommonName等,可以自行输入,也可以按Enter键使用默认
值。输出文件包括ca.key与ca.crt。具体的CA 建立流程演示,可参考本书附带的微课
视频。
42 
创建自己
的CA

第3章 密码技术应用 
任务3.4 在实验报告中截图展示这两个文件,写明两个文件分别存储什么内容,并回
答:证书中的Issuer与Subject分别代表什么? 为什么ca.crt文件中这两个域的数据相同? 
注:除了在图形化界面直接查看证书信息外,也可以使用以下命令在命令行查看证书
信息: 
$openssl x509 -in ca.crt -text -noout 
2. 利用CA 签发证书
假设有一个网站PKI.com,需要从CA 处取得一个电子证书,可以通过以下步骤完成签
发流程。
首先,PKI.com 需要生成自己的公私钥对: 
$openssl genrsa -aes128 -out server.key 2048 
该命令将生成一对2048比特的RSA 公私钥对,同时将私钥用AES128加密,并存储在
server.key文件中。在生成时,用户需要输入私钥加密所用的口令,同样地,请使用简便易
记的口令并牢记。可以使用以下命令在命令行查看密钥信息(需要输入私钥加密口令): 
$openssl rsa -in server.key -text 
其次,PKI.com 需要生成证书请求文件(CSR)。该文件包含PKI.com 的公钥,并会被
发送给CA,请求CA 对公钥进行签名: 
$openssl req -new -config openssl.cnf -key server.key -out server.csr 
在生成证书请求文件时,可在CommonName域输入“PKI.com”;对于extra中的
attributes域,可自行输入,或直接按Enter键使用默认值;对于其他域,应与CA 保持一致。
最后,CA 收到证书请求文件(server.csr)后,利用自己的私钥(ca.key)与证书(ca.crt), 
签名并生成PKI.com 所需的X.509证书(server.crt),使用的命令如下所示: 
$openssl ca -config openssl.cnf -in server.csr \ 
-keyfile ca.key -cert ca.crt \ 
-out server.crt 
任务3.5:在实验报告中截图展示所有生成文件(server.key,server.csr,server.crt),并指
明它们的关系。
3. 验证CA 签发证书的签名
查看PKI.com 证书(server.crt)的相关信息: 
$openssl x509 -in server.crt -text -noout 
可以看到证书文件分为3部分,Data域、SignatureAlgorithm 域与SignatureValue域。其
中,Data域为证书的基本信息部分,也称为TBSCertificate(To-Be-SignedCertificate);而
SignatureAlgorithm域是CA使用的签名算法;SignatureValue域是CA利用指定签名算法对
TBSCertificate哈希值的签名结果。例如,若签名算法为sha256WithRSAEncryption,则表示
CA计算TBSCertificate的SHA256哈希值,并使用RSA算法对该哈希值进行签名。
43

网络安全创新实验教程(微课版) 
寻找证书中TBSCertificate的位置: 
$openssl x509 -in server.crt -inform pem -outform pem -out server.pem 
// 以ASN.1 格式解析PEM 文件
$openssl asn1parse -i -in server.pem 
该命令的输出如图3-5所示。根据ASN.1标准的定义,第2行(图3-5中的方框)表示
TBSCertificate在PEM 文件中的偏移量(offset)为4,总长度为642(头长度为4,主体长度
为638)。
图3-5 证书ASN.1解析结果
根据解析的信息提取TBSCertificate,保存为server.tbs文件,并计算该文件的哈希值
(哈希算法以证书指定版本为准,此处以SHA256算法为例): 
$openssl asn1parse -in server.pem -strparse 4 -out server.tbs 
$sha256sum server.tbs 
任务3.6 从server.crt中提取该证书的签名,从ca.crt中提取CA 的公钥(Exponent 
与Modulus),填入实验给定的Python代码中,并补充代码文件,使其完成利用CA 公钥对
该签名的验证过程,即对比Python程序输出与上述计算的哈希值。
注: 
(1)在Python中,可以用pow(x,y,z)计算xymodz。
(2)Python程序的输出由3部分组成,分别为RSA 算法的填充(“1fff…”),ASN.1 
SHA256算法指定前缀(“3031300d060960864801650304020105000420”)与哈希值。
4. 将证书用于HTTPS Web 服务器
CA 签发的证书可以用于建立HTTPS连接。本实验将利用openssl为PKI.com 网站
建立一个简单的HTTPSWeb服务端。
首先,配置DNS服务。为了让虚拟机能够解析该域名,需要将以下字段填入虚拟机/etc/ 
hosts文件中;该字段将主机域名PKI.com映射到虚拟机本地机(127.0.0.1为回送地址)。 
127.0.0.1 PKI.com 
然后,基于之前生成的证书,使用openssls_server命令建立一个简单的Web服
务器。 
// 将密钥与证书合成为一个文件
44

第3章 密码技术应用 
$cp server.key server.pem 
$cat server.crt >>server.pem 
// 利用server.pem 建立一个Web 服务器
$openssl s_server -www -cert server.pem 
// 使用CTRL+C 键可以关闭该服务器进程
openssls_server命令建立的服务器默认监听4433端口,因此,可以通过以下URL访
问该服务器:https://PKI.com:4433/。
任务3.7 访问设立的Web服务器,截图记录访问结果,描述观察到的情况,并解释
原因。注
:此时浏览器应出现报警页面,如图3-6所示。可以单击“Advanced...”按钮查看报
警信息,但不要单击Advanced之后弹出页面上的“AccepttheRiskandContinue”按钮。
图3-6 浏览器报警页面
任务3.8 为了能够顺利访问Web服务器,需要在Firefox的CA 列表中加入之前建立
的CA 证书,添加方式参考附录G。再次访问Web服务器https://PKI.com:4433/,截图展
示并描述观察到的情况(注意地址栏的图标)。
任务3.9 本实验在设置域名解析时,将https://PKI.com:4433/指向本地机,若访问
https://localhost:4433/,会出现什么情况? 截图展示访问情况与报警信息,并解释原因。
5. 建立基于Apache 的HTTPS 网站
利用Apache服务建立一个HTTPS网站,需要修改Apache配置文件,指定网站文件
以及网站密钥与证书的存储位置。例如,要建立一个名为example.com 的网站,需要在
/var/www文件夹中新建一个名为example的文件夹,在其中新建一个名为index_https. 
html的文件,并填入以下内容(对于熟悉HTML的读者,也可以自行编写一个简单的网页
文件): 
<html> 
<head> 
<title>example</title> 
</head> 
<body> 
<p>This is the page from HTTPS server.</p> 
</body> 
45

网络安全创新实验教程(微课版) 
</html> 
利用以下命令修改/etc/apache2/sites-available/default-ssl.conf文件: 
<VirtualHost _default_:443> 
ServerName example.com 
DocumentRoot /var/www/example 
DirectoryIndex index_https.html 
SSLEngine on 
SSLCertificateFile #填入网站证书文件的绝对路径
SSLCertificateKeyFile #填入网站密钥文件的绝对路径
</VirtualHost> 
SSLCipherSuite AES256-SHA #指定加密组件
配置文件修改完毕后,需要利用以下命令打开Apache的SSL模块: 
// 测试Apache 配置文件
$sudo apachectl configtest 
// 打开SSL 模块
$sudo a2enmod ssl 
// 使用编辑好的网站配置
$sudo a2ensite default-ssl 
// 启动或者重启Apache,取决于当前Apache 服务的状态
$sudo service apache2 start 或者
$sudo service apache2 restart 
任务3.10 利用CA 为PKI.com 签发的RSA 证书,配置Apache服务,建立一个基于
Apache的HTTPS网站。
(1)截图展示建立过程。
(2)截图记录网站访问结果。 
3.3 PGP加解密技术 
3.3.1 实验目的
了解PGP加解密过程涉及的密钥和PGP的工作原理;了解PGP信任网络的基本结
构;掌握使用PGP软件对邮件进行加解密以及签名的方法。
3.3.2 实验内容
熟悉PGP软件的命令行操作,熟悉生成PGP密钥、导入公钥、证明公钥有效性等基本
操作,并使用PGP密钥对邮件进行加解密与签名。
46

第3章密码技术应用
3.3 
实验原理
3.
PGP 是PhilZimmermann于1991 年开发的一种可为数据通信提供加密与身份认证的
程序,常用于电子邮件的加解密与签名,提高了电子邮件通信的安全性。PGP 本身是商业
应用程序,开源并具有同类功能的工具是由自由软件基金会开发的GnuPG(GPG )。PGP 
及其同类产品均遵守OpenPGP 数据加解密标准(RFC4880 )。

PGP 加密由一系列散列、数据压缩、对称密钥加密和公钥加密的算法组合而成。每个
步骤均支持几种算法,用户可选,其工作原理如图3-7所示。


图3-7PGP 加解密工作原理示意图
在PGP 加解密过程中会用到不同的密钥,其用途总结如表3-4所示。

表3-
4 
PGP 
加解密过程所用密钥及其用途

密钥名

会话密钥
公钥
私钥
口令
会话密钥
公钥
私钥

用途

对传送消息的加解密,随机生成,一次性使用
对会话密钥加密,收发双方共享
对会话密钥解密,接收者专用
对私钥加密,存储于接收端
对传送消息的加解密,随机生成,一次性使用
对会话密钥加密,收发双方共享
对会话密钥解密,接收者专用

每个公钥均绑定一个用户名和/或E-mail地址。PGP 公钥会被发布到其公钥服务器
上,供所有人下载使用。PGP 协议中,用户需要建立一个公钥环形存储器(PKR), 以存储其

47 


网络安全创新实验教程(微课版) 
他用户的公钥。在使用公钥前,用户需要保证该公钥确实是所指定用户的有效公钥。PGP 
使用一个名为信任网络(WebofTrust)的信任模型来实现对公钥身份的认证。在信任网络
模型中,有效的公钥可以是来自所信任的人的公钥,也可以是由所信任的人为其他人签名的
公钥。因此,在得到一个PGP公钥后,用户需要检验其签名,通过对签名用户的信任程度
(信任决策的参数可调)确定该公钥的有效性。
图3-8给出一个PGP信任模型的示例。在一个公开密钥环结构中,用户已获得一组公
钥,其中部分公钥直接来自于密钥的拥有者,部分来自于第三方,如密钥服务器。节点中的
标记代表公钥环中相对于该用户的实体。图3-8中,节点的阴影或空白显示YOU 用户指
派的信任程度,树形结构显示了哪些密钥被哪些用户签名。在该示例中,YOU 用户完全信
任用户D对于其他密钥的签名,部分信任用户A、B对其他密钥的签名。假设用户设置两个
部分可信的签名可以证明一个公钥,那么用户F的密钥被PGP认定为是有效的,因为它有
部分信任用户A、B的签名。即使一个密钥被认定为有效的,但其拥有者对其他密钥的签名
不一定可信。例如,用户I的密钥是有效的,因为其有用户D的签名,且用户D为YOU 可
信任的;但用户I对其他用户密钥的签名不可信任,因为用户没有指派对用户I的信任程
度。因此尽管用户J密钥拥有用户I签名,但PGP仍不认为用户J密钥是有效的。
图3-8 一个PGP信任模型的示例
3.3.4 实验步骤
安装实验所需软件: 
$sudo apt-get install gnupg thunderbird=1:68.7.0+build1-0ubuntu2 
其中,thunderbird用于搭建邮件客户端(本实验选用旧版本进行,方便练习GnuPG 操作), 
gnupg用于进行PGP实验。
创建实验目录并进入: 
$mkdir PGP/ 
$cd PGP 
1. 利用Thunderbird 搭建邮箱客户端
在图形界面打开Thunderbird,或在命令行输入: 
$thunderbird 
48

第3章 密码技术应用 
在“SetUpYourExistingEmailAddress”下填入个人邮箱,例如QQ 邮箱或者Gmail 
邮箱。对于各类邮箱,都需要在网页版邮箱设置中打开SMTP与IMAP。对于QQ 邮箱, 
需要额外设置一个授权码,并且在Password处填入设置的授权码。对于Gmail邮箱,除了
打开邮件协议外,还需要在Google账号设置中启用“安全性较低的应用的访问权限”;然后
单击Continue进行配置,显示“Configurationfoundin...”之后,需要核对Incoming的协议
选择IMAP,而不是POP3协议(虚拟机的硬盘空间可能无法容纳邮箱内所有邮件文件),如
果需要修改请单击“Configure manually”。一切完成后单击Done 按钮。然后,在
Thunderbird上安装支持PGP加密和签名邮件的插件Enigmail,安装方式可以参考附录
H。完整的Thunderbird搭建与Enigmail安装流程可参考本书附带的微课视频。
2. GnuPG 命令行练习
Enigmail可以帮助用户管理PGP密钥,包括生成、删除、发布、导出等。另外,这些功能
也可以在命令行通过GnuPG的命令实现,下面介绍GnuPG 的部分命令,还可以使用man 
gpg查看更多命令功能。 
// 生成PGP 密钥
$gpg --gen-key 
// 查看公钥
$gpg --list-keys 
// 查看私钥
$gpg --list-secret-keys 
// 导出公钥,--armor 参数代表将其转换为ASCII 码格式,可以缩写成-a 
$gpg --armor --output [output_file]--export [KeyID] 
// 导出私钥
$gpg --armor --output [output_file]--export-secret-keys [KeyID] 
// 加密[input_file],并将结果输出到[output_file]中
$gpg --output [output_file]--encrypt [input_file] 
// 解密[input_file],并将结果输出到[output_file]中
$gpg --output [output_file]--decrypt [input_file] 
// 签名[input_file],生成[input_file].gpg 文件,默认采用二进制存储
$gpg --sign [input_file] 
// 验证[input_file]签名是否为真
$gpg --verify [input_file] 
// 以下参数添加在gpg 命令后: 
// --recipient [UserID]指定用于加密、验证签名的公钥
// --local-user [UserID]指定用于解密、生成签名的私钥
GnuPG密钥在生成过程中会要求填入个人信息用于生成密钥的UserID。需要注意, 
在EmailAddress字段需填入之前用于设置Thunderbird邮箱客户端的邮箱地址,而Real
49 
Thunderbird 
搭建与
Enigmail

网络安全创新实验教程(微课版) 
Name 域可自行定义。完成后输入大写字母O结束配置,操作示例如图3-9所示。


图3-9PGP 密钥生成示例

此时,终端会弹出要求填写密钥加密口令的对话框,如图3-10 所示,请使用简便易记的
口令并牢记,便于后期邮件的收发实验。


图3-10 密钥加密口令填写对话框

密钥生成过程的参数会默认选定,包括使用3072 比特密钥的RSA 算法;密钥有效期为
两年等。
注:在密钥的生成过程中,终端会提示用户能够通过尝试敲击键盘、移动鼠标等随机举
动来增大随机数生成器的熵值。

最终生成示例如图3-11 所示,每个密钥会由软件随机生成的字符串作为其指纹。同
时,每个密钥拥有KeyID 与UserID 两个标识符,UserID 是之前输入的用户个人信息, 
KeyID 则是指纹字符串的后16 位字符。注意,部分命令要求输入KeyID 作为参数时,输入
指纹的后8位同样可实现目标功能。


图3-11PGP 密钥标识符示意

50 


第3章 密码技术应用 
利用GnuPG命令行工具进行密钥配置的详细过程,可参考本书附带的微课视频。
任务3.11 进入PGP实验目录,生成自己的PGP密钥,并实验加解密、签名验证过程, 
截图记录实验命令与过程结果。
3. PGP 加解密和签名邮件
SMTP,IMAP,POP3等邮件协议都是明文协议。尽管现在的电子邮件服务都会在这
些协议之上再加一层SSL/TLS协议,保证邮件从客户端到服务器的机密性,但是对于服务
器而言,所有邮件都是明文的,而且在电子邮件邮箱的服务器之间依旧以明文方式传输。因
此,要是想通过邮件传递秘密消息,可以使用PGP技术对邮件内容进行加密。另外,PGP 
还提供对邮件的数字签名功能。在上述实验步骤中,已经在Thunderbird中安装了支持
PGP加密和签名邮件的插件Enigmail,同时生成了对应邮箱的密钥,以下实验将练习如何
在Thunderbird中利用PGP密钥加解密、签名邮件。
首先,打开Thunderbird,单击工具栏中Enigmail下的“Setup Wizard”,弹出窗口提示
已经装有GnuPG,同时也生成了对应邮箱的密钥,单击“Applymykey”按钮后,可以在
“KeyManagement”中找到生成的密钥。
然后,对于加密与签名技术,收发信人之间必须共享各自的公钥,这可以通过上传公钥
到公钥服务器共享实现,也可以通过导出公钥文件并复制/传递实现。由于公钥服务器需要
时间同步,上传的公钥可能不能及时在公钥服务器上搜索到,所以本实验推荐使用第2种方
法实现,命令行使用如下命令(以收信人A 将公钥传给发信人B为例): 
对于收信人A: 
// 导出公钥文件
$gpg -a --output [key_file]--export [KeyID_A] 
// 收信人将公钥文件传输给发信人(可以通过邮箱等方式) 
对于发信人B: 
// 导入对方的公钥文件
$gpg --import [key_file] 
// 查看该公钥文件的有效性
$gpg --edit-key [KeyID_A] 
// 输入quit 退出查看
在gpg--edit-key[KeyID]的命令行输出中,trust域表示当前用户对该公钥持有者的
信任程度,而validity域表示该公钥的有效性。图3-12给出了一个查看PGP密钥信任程度
(方框标识的trust域)与有效性(方框标识的validity域)的示意图。
此时导入的公钥文件的validity域应为unknown,因为用户没有指派对该公钥持有者
的信任程度,该公钥也没有签名信息。若要使用该公钥,则需要用户用自己的PGP密钥对
其签名,证明其有效性。 
对于发信人B: 
// 查看接收公钥指纹值并与收信人A 确认
$gpg --fingerprint 
// 确定对自己密钥的信任程度
51 
配置密钥

网络安全创新实验教程(微课版) 
图3-12 查看PGP密钥信任程度与有效性示意图
$gpg --edit-key [KeyID_B] 
// 若此时自己密钥的trust 域为unknown, 需要在GnuPG 命令行中输入trust 命令, 选择“I 
trust ultimately”并保存,完成对当前密钥的信任更新
// 利用自己的密钥签名接收公钥
$gpg --sign-key [UserID_A] 
// 再次查看该公钥文件的有效性
$gpg --edit-key [KeyID_A] 
再次查看Enigmail下的“KeyManagement”,会发现导入的公钥也在其中。
在Thunderbird主页面,左侧选中设置好的邮箱,在主页面上端单击Write,会出现写信
窗口。在收件人地址栏填入已经导入过公钥的邮箱地址,窗口上方工具栏的加密与签名图
标是活动的,可以单击图标切换是否加密与是否签名。例如,图3-13所示的操作是加密该
邮件,但不签名。
图3-13 Thunderbird加密但不签名邮件示意图
任务3.12 请两两分组,共享公钥并截图记录过程。然后,两两之间互相发送:①不加
密不签名;②加密但不签名;③加密且签名的邮件,查看并截图记录收到邮件的邮件源码
与Enigmail安全信息,描述观察情况。
图3-14 Thunderbird查看邮件源码
注:在Thunderbird界面,点开一封邮件后,下
方会出现邮件正文。若是想查看邮件源码,可以选
择工具栏View 下的“MessageSource”命令,如
图3-14所示,弹出窗口中的文本内容即是邮件
源码。同
时,对于经过PGP处理的邮件,在邮件正文上
方还能看见Enigmail提供的安全信息,选择Detail下
的“EnigmailSecurityInfo”命令,如图3-15所示,就能
看到该邮件的详细安全信息。
4. PGP 加解密应用
从公钥服务器上搜索并导入[KeyID]为
A60D32AA62CC76AF的公钥: 
52

第3章 密码技术应用 
图3-15 Thunderbird查看邮件安全信息 
$gpg --keyserver keyserver.ubuntu.com --search-key [KeyID] 
$gpg --keyserver keyserver.ubuntu.com --recv-key [KeyID] 
* 选做任务3.1 利用该公钥加密实验报告,并提交加密后的实验报告文档。 
3.4 实验报告要求 
(1)条理清晰,重点突出,排版工整。
(2)内容要求。
① 实验题目。
② 实验目的与内容。
③ 实验结果与分析(按步骤完成所有实验任务,详细记录并展示实验结果和对实验结
果的分析)。
④ 实验思考题: 
. Linux系统为什么要分别设立/etc/passwd文件与/etc/shadow 文件? 它们在文件
内容与权限两方面有什么区别? 
. 简述CA 签发证书的过程。
. 在使用PGP加解密技术进行邮件加密与签名时,收发信人之间为什么要共享各自
的公钥? 
⑤ 遇到的问题和思考(实验中遇到了什么问题,是如何解决的,在实验过程中产生了什
么思考)。 
本章参考文献 
[1] Ubuntu manuals.man5passwd[EB/OL].(2019-03-30)[2022-08-21].http://manpages.ubuntu. 
com/manpages/xenial/man5/passwd.5.html. 
[2] Ubuntu manuals.man5shadow[EB/OL].(2019-02-24)[2022-08-21].http://manpages.ubuntu. 
com/manpages/xenial/man5/shadow.5.html. 
[3] Openwall.JohntheRipperpasswordcracker[EB/OL].(2022-06-20)[2022-08-21].https://www. 
openwall.com/john/. 
[4] Cooper,etal.InternetX.509PublicKeyInfrastructureCertificateandCertificateRevocationList 
(CRL)Profile[EB/OL].(2008-05-01)[2022-08-21].https://tools.ietf.org/html/rfc5280. 
53

网络安全创新实验教程(微课版) 
[5]SedLabs.PublicKeyInfrastructure(PKI)Lab[EB/OL].(2010-04-11)[2022-08-31].htps:// 
sedeuiyasog/Las_16.ypo/Cypo_/.scrtlb.rb04/CrtrtPKI

[6]OpeSSL.peslxnpage[EB/OL](20211101)[20220831]htps:opn.rnon-509ma.----.//www.eslog/
dosn0.n1/pn-509.tl.c/ma1.2/maoeslxhm

[7]Cas,elOpePGPMegeFrmat[EB/OL].(20071121)[20220831]htps://ol.eflata.nsao----.tosit. 
org/html/rfc4880. 

54