简介这份文档围绕密码学核心概念做系统梳理适合刚接触信息安全、准备面试或需要补基础的开发者与学习者阅读重点厘清公钥、私钥、单钥与双钥加密之间的关系并延伸到数字签名、数字证书及 HTTPS 应用场景。压缩包内仅含 1 个 docx 文件大小约 310KB篇幅集中、便于检索适合作为碎片化复习或建立知识框架的轻量资料。目前已有 627 人学习下载具备一定参考热度。内容从单钥加密的密钥保存风险讲起对比 DES 与 RSA 等典型算法再以鲍勃、苏珊的通信示例拆解数字签名中 Hash 摘要、私钥加密、公钥验证的完整流程并说明证书中心如何签发数字证书、浏览器如何校验身份最后落到 HTTPS 加密通信。读者可借此把抽象术语串成一条可理解的安全链路形成对公钥基础设施的初步认识。1. 密码学地图四把钥匙串起来的一条信任链很多人第一次接触密码学是从「加密就是把明文变成密文」这句话理解起的于是把公钥、私钥当成两把锁把数字签名当成一种更高级的加密把数字证书当成网址旁边那个标志。这份笔记最初也这么记直到被追问「为什么签名用私钥、加密反而用公钥」时当场翻车。真正的主线只有一条密钥怎么分发、身份怎么证明、信任锚放在哪。单钥加密解决同一把钥匙两头用的效率问题双钥加密解决钥匙怎么送到对方手里的分发问题数字签名解决「这条消息是不是你发的」数字证书解决「这把公钥到底属于谁」。四块内容串成一条从算法到信任的链路公钥、私钥、数字签名、数字证书各自的位置一目了然。复习时顺着这条链路走比死背概念清单省力得多反过来只背概念不串链路考场上换个问法就答不上来。2. 两把钥匙的边界单钥与双钥到底各自解决什么问题2.1 单钥加密的命门密钥保存与分发单钥加密的规则很朴素加密和解密用的是同一套密码所以它也叫对称加密。人类历史上的传统加密方法几乎都落在这一侧二战时期的转轮电报密码机走的就是这条路连莫尔斯电码也能看作一种私钥加密方法——收发双方共享同一套编码约定约定一旦泄露内容就等于公开。它的优点同样明显算法简单、运算快、适合大批量数据所以直到今天真正在跑海量数据的仍然是这一类算法。问题出在密钥本身。整套体系只有一把钥匙密钥的保存就成了命门一旦泄漏密码随之被破解之前发过的所有密文都可能被翻出来重读没有后悔药可吃。比保存更麻烦的是分发n 个人要两两私密通信需要 n(n-1)/2 把各不相同的密钥。10 个人要 45 把100 个人要 4950 把1000 个人接近 50 万把——钥匙数量随人数平方增长管理、轮换、作废的成本跟着一起爆炸。通用单钥算法的代表是 DES产生于上世纪 70 年代和后面要讲的 RSA 属于同一时期的产物。复习这类算法时重点不在记住某一次加密的轮数细节而在记住它带来的两个工程后果第一密钥必须通过一条安全通道提前送到对方手里第二密钥数量是 O(n²)人一多就得靠密钥中心统一托管而密钥中心本身又成了单点风险。2.2 双钥加密的四条性质公钥为什么敢公开双钥加密把一套密码拆成两套一把是公开的公钥一把是不公开的私钥所以也叫非对称加密。那份笔记给了四条性质这四条是整章的骨架值得逐条抠清楚因为后面所有关于签名和证书的推导都建立在这四条上。编号性质表述在体系里的作用a公钥与私钥一一对应有一把公钥就必然有一把独一无二与之对应的私钥反之亦然保证钥匙对不会「多对一」否则验证就失去唯一性b所有公钥, 私钥对都是不同的保证不同主体的密钥不会撞车c用公钥可以解开私钥加密的信息反之亦成立规定了两把钥匙互为逆向操作是两个使用方向的基础d同时生成公钥和私钥相对容易但从公钥推算出私钥很困难或者不可能整个体系的安全根基前三条规定了「能用」第四条规定了「敢公开」。如果公钥能轻易反推出私钥那么公开公钥就等于公开私钥整个体系瞬间归零。所以安全性的本质落在一个单向陷门函数上正向计算由私钥算公钥、由密钥做加解密很容易反向计算由公钥倒推私钥在现有算力下不可行。RSA 是通用双钥算法的代表同样产生于上世纪 70 年代它的安全性建立在整数分解这类数学难题上。这里有个容易被说错的细节性质 d 的准确表述是「困难或者不可能」它描述的是计算可行性而不是「理论上存在某条路径只是概率很小」。把这句话讲成「有小概率能推出来」是把计算复杂度问题错讲成了概率问题考试里这样答会被扣分。2.3 两种体系的对比什么时候用哪一套把两套体系放在一张表里对照比分别背两段定义有效得多。复习时如果能不看表把下面每一行复述出来这一块基本就过关了。维度单钥对称加密双钥非对称加密密钥数量一套密钥收发双方共享两套密钥公钥公开、私钥自留核心难题密钥怎么安全送达并保管公钥被伪造替换怎么办密钥规模n 人两两通信需 n(n-1)/2 把每人一对总量与人数同阶运算速度快适合大批量数据慢只适合小数据或密钥本身典型算法DES 等单钥算法RSA 等双钥算法主要用途加密正文数据加密会话密钥、做数字签名泄漏后果全部历史密文可被解密私钥泄漏则身份可被冒充梳理下来会发现一个工程上的反差双钥加密解决了分发难题却带来了性能问题单钥加密性能好却解决不了分发。所以真实系统里两者从来不是二选一而是分工——用非对称算法加密或协商出一把临时的对称会话密钥正文数据交给对称算法去跑。这就是常说的混合加密思路理解了这一层后面看 HTTPS 的流程就不会觉得它在绕弯子。2.4 加密用公钥、签名用私钥方向为什么不能反那份笔记里有一句很短但极关键的话在双钥体系中公钥用来加密信息私钥用来数字签名。这句话是整个密码学里最容易记反的一处因为它表面上不对称实际背后是一套很自然的目标推导。加密的目标是「只有指定的接收方能看到内容」。既然公钥是公开的任何人都能拿到接收方的公钥那用接收方的公钥加密就只有握有对应私钥的接收方能解开保密性成立。签名的目标恰好相反是「任何人都能验证但只有我能生成」。那就必须用只有自己掌握的私钥去生成签名让所有人拿公开的公钥来验证身份的不可冒充性才成立。你想要的效果用谁的哪把钥匙谁能完成反向操作典型场景内容保密只有对方能看接收方的公钥加密接收方用自己私钥解密发送机密信件证明是我发的、且没被改发送方自己的私钥签名任何人用发送方公钥验证数字签名、代码签名既要保密又要证明来源先签名再用对方公钥加密对方先解密再验签带身份认证的加密消息记住一句话就够用要保密用对方的公钥要证明用我自己的私钥。把这句话当口诀背下来比每次现推都快也不容易在紧张时出错。3. 数字签名摘要、私钥与验签的三段链路3.1 Hash 摘要为什么先压缩再签名数字签名的第一步不是加密而是对消息做 Hash生成摘要digest。这一步的必要性经常被跳过结果就是只记得「私钥加密摘要」这个动作却说不清为什么不能直接对整篇内容做私钥运算。原因有两层。第一层是效率非对称运算本来就慢如果消息有几百 KB直接拿私钥对全文做运算代价高到不可接受。第二层是长度非对称算法能处理的数据长度有上限而消息长度是任意的直接把长短不一的内容塞进签名算法工程上根本走不通。Hash 把任意长度的输入压成定长的摘要签名就只需要对这一段固定长度的值做运算问题一次性解决。Hash 函数本身还有几条必须记住的性质输出定长、单向不可逆、抗碰撞、输入微小改动会导致输出剧烈变化。抗碰撞尤其关键——如果能轻易找到两条内容不同但摘要相同的消息攻击者就可以把原消息换成伪造内容而签名依然验证通过整个签名体系就失效了。这也解释了一个常见误解摘要不是加密它不能被「解密」回原文它只是一个指纹。3.2 签名与验签一条可以照着默写的流程那份笔记用一组图讲清了完整的签名过程先对信件做 Hash 得到摘要再用私钥对摘要加密生成签名把签名附在信件后面一起发出收信方取下签名用发送方公钥解出摘要再对信件本身做一次 Hash两者比对一致就说明消息来自对方且未被修改。这条流程值得用可执行的伪代码固化下来复习时能默写出来就说明真懂了。import hashlib def digest_of(message: bytes) - str: 第一步Hash 摘要把任意长度的消息压成定长指纹 return hashlib.sha256(message).hexdigest() def sign(message: bytes, private_key) - bytes: 第二步签名方用私钥对摘要做签名运算 真实实现由签名库完成填充与模幂运算这里只表达流程 d digest_of(message) return private_key.sign(d.encode()) def verify(message: bytes, signature: bytes, public_key) - bool: 第三步验签方用公钥还原摘要再对原文重新摘要比对 recovered public_key.verify(signature).decode() return recovered digest_of(message)逻辑上要抓住三点。其一签名覆盖的是摘要而不是全文所以验签必须对原文重新算一遍摘要任何一字节改动都会让两次摘要不同。其二verify里先做公钥运算还原摘要再做字符串比较两步顺序不能反否则等于没验证来源。其三函数签名里的private_key和public_key是密钥对象而非裸数字signature是附在消息后一起传输的字节串digest_of固定输出 64 位十六进制串。这段代码是流程示意工程里必须调用成熟的签名库不要自己拼裸运算否则填充方式一错就会踩进教科书级的坑。3.3 教学模型与工程实现的差距私钥「加密摘要」这个说法那份笔记把签名描述为「用私钥对摘要加密」这个说法在讲解方向时非常直观但严格来讲签名不是加密。加密要求可还原加密方和被加密方是同一份数据的两种状态签名生成的是一个只有私钥持有者才能算出的值验签做的是用公钥对这个值做一次反向校验而不是把某个东西「解回来」。差距体现在两处。第一处是填充真实的 RSA 签名不是对摘要直接做模幂中间要经过填充方案编码把摘要包装成特定结构再运算验签时同样要按规则还原并比对这个结构。如果自己拿底层接口裸拼少了填充校验就可能被构造出「同一份签名对多条消息都成立」的情况。第二处是算法家族不同像 DSA、ECDSA、EdDSA 这一类签名算法本身只做签名根本不具备加密解密能力「私钥加密摘要」这种说法套上去就完全讲不通。所以正确的记法是签名 用私钥对「消息的摘要」做一次只有私钥持有者能完成的运算验签 用公钥验证这个运算结果确实对应这段摘要。把「加密」这个动词换成「运算」很多说不通的地方就顺了。提示复习时如果被问到「为什么不能直接对全文签名」从效率、长度上限、摘要定长这三条回答如果被问到「私钥加密摘要是否严谨」从填充和算法家族两条回答。3.4 签名能证明什么、不能证明什么数字签名经常被当成万能药实际上它的覆盖范围非常明确。它能证明两件事消息确实来自私钥的持有者来源真实性以及消息在传输过程中没有被修改完整性。再往前推一步还有第三件因为只有私钥持有者能生成签名所以事后无法否认自己发过这条消息这就是不可否认性。它不能证明的事情同样要记住。签名不提供保密性——签名是附在消息后面的消息本身是明文谁拿到都能看想保密必须另外加密。签名也不能证明公钥属于谁——验签只能证明「某个私钥的持有者签了这条消息」但如果手里那把公钥本来就是别人偷偷换过的验签照样通过这就是经典三方故事里攻击者冒充成功的根源也是数字证书要解决的问题。签名还不能防重放同一条签名消息被截获后原样再发一次接收方仍然验签通过要挡住这种情况得靠时间戳或一次性随机数。安全目标数字签名能否覆盖还需要什么来源真实性能无完整性能无不可否认性能私钥未泄漏保密性不能额外加密公钥归属可信不能数字证书防重放不能时间戳、随机数、序号4. 数字证书公钥信任链与 HTTPS 的校验动作4.1 换公钥攻击签名体系留下的信任缺口把签名流程走通之后一个很自然的疑问会冒出来验签要用发送方的公钥那这把公钥是怎么到收信方手里的如果公钥本身可以被替换前面所有推导都会塌掉。那份笔记里的三方故事正是讲这个A 把公钥分发给若干朋友B 准备回信时先用 Hash 生成摘要再用自己私钥做成签名附在信后B 用 A 的公钥解出摘要并比对成功确认消息来自 A。到这里一切正常。真正的转折出现在第三方 CC 偷偷在收信人的电脑上用自己的公钥换掉了 A 的公钥。收信方以为自己手里握着的是 A 的公钥实际握的是 C 的公钥于是 C 就能用自己的私钥伪造签名收信方用那把假的公钥去验居然一路通过。整个攻击没有破解任何算法只是换了一把公钥。这个案例的价值在于它把问题定位得很准签名算法没有问题问题出在「公钥和身份之间的绑定关系」上。算法能保证「谁签的」但无法保证「你手上这把公钥是谁的」。前一个问题在数学层面后一个问题在信任层面必须引入第三方才能解决。4.2 证书中心做了什么用 CA 的私钥给公钥背书解决思路是把公钥拿去盖章。具体做法是公钥持有者去找一个双方都信任的第三方机构也就是证书中心certificate authority简称 CA把自己的公钥和一批相关信息一起交过去由 CA 用自己的私钥对这份信息做运算生成数字证书。此后发消息时除了签名再附上这张证书即可。验证方收到后用 CA 的公钥去解这张证书从中取出被认证过的公钥再用它去验证签名。攻击者想冒充就难了——他要么得伪造一张 CA 签过名的证书要么得换掉验证方手里的 CA 公钥两个方向都被堵住。这里的关键是「信任锚」的位置发生了转移不再信任任意一把陌生公钥而是信任预先内置在系统里的那一小撮 CA 公钥。一张证书里到底装了什么复习时可以按字段过一遍。字段作用复习时容易忽略的点版本与序列号标识证书格式与唯一编号序列号是吊销查询的索引不是装饰签名算法说明 CA 用哪种算法签的要与证书自身的公钥算法区分开签发者指明是哪家 CA 签的与「根」不是同一个概念有效期起止时间过期证书即使签名正确也无效主体证书持有者身份信息与访问的域名要能匹配上主体公钥信息被认证的那把公钥这才是整张证书真正要保护的东西扩展项用途限制、备用名称等域名不匹配的告警常源于这里CA 签名CA 用私钥对上述内容的签名验的是这一段不是整张证书文本梳理下来会发现证书本身不神秘它就是「一份结构化信息 一个来自 CA 的签名」只是这份签名保的是一把公钥而不是一段普通消息。再往上还有一层实际部署中很少由根证书直接签站点证书而是根签中间证书、中间证书再签站点证书形成一条证书链。验证时要沿着链一节一节往上验直到落到信任锚为止。4.3 HTTPS 里的校验动作浏览器到底查了哪几项那份笔记最后用 HTTPS 收尾给了一条完整流程客户端向服务器发出加密请求服务器把自己的数字证书连同响应一起发回客户端的证书管理器里有一份受信任的根证书颁发机构列表先看解证书用的公钥是否在这份列表内再看证书里记载的网址和正在访问的网址是否一致不一致就警告再看签发机构是否受信任不受信任就另一种警告都通过之后才用证书里的服务器公钥加密信息并交换。这几步值得拆开看因为每一步对应一类真实故障。第一类证书不是受信任机构签的或者证书链断在中间浏览器直接拦下这是最常见的一类报错。第二类证书本身合法但证书里记载的域名和当前访问地址对不上这通常意味着证书被挪用了或者站点配置漏了备用域名。第三类证书过期签名仍然正确但有效期已过。第四类证书被吊销需要通过吊销列表或在线状态查询来确认这一项最容易被漏掉因为证书文件本身看上去完好无损。这里必须补上一处原笔记的简化文中说「服务器用自己的私钥加密网页」这在教学上是为了对齐前文的钥匙方向但工程实现并非如此。私钥加密的内容任何人都能用公钥解开根本不具备保密性。真实的握手过程是用非对称算法协商出一个只有双方知道的对称会话密钥网页正文再用这个会话密钥加密传输——这正好呼应第 2 章讲的混合加密。把这一点讲清楚从「教学模型」到「工程实现」的那道坎才算迈过去。想直观看看证书长什么样可以用命令行工具把字段打出来比对着表格看一遍印象深得多。# 查看证书明文内容签发者、主体、有效期、公钥、签名算法 openssl x509 -in server.crt -text -noout # 校验证书是否由指定 CA 签发即验证签名链是否完整 openssl verify -CAfile ca.crt server.crt第一条命令里-in指定输入的证书文件-text要求输出可读文本-noout表示不要把原始的 PEM 编码再打印一遍否则输出会很长。第二条命令里-CAfile指定信任锚文件被验证的证书作为最后一个参数传入如果中间证书缺失会直接报链不完整这正是排查「证书链断裂」类故障最直接的入口。两条命令都不需要联网本地就能复现适合反复练手。4.4 把四块内容串成一条验证链到这里可以把整条链路默写一遍消息先过 Hash 得到摘要私钥对摘要运算得到签名签名与消息一起发出同时附上由 CA 签发的数字证书接收方用内置的 CA 公钥验证证书从证书里取出可信的发送方公钥再用这把公钥验证签名还原摘要最后对收到的消息重算摘要做比对。五步里任何一步断开整条信任链就失效。这条链也是考试里最常出的综合题题目往往只给一个场景问「如果攻击者控制了某一步会发生什么」。能顺着链一路推下去就知道每一步被攻破的后果分别是什么——换公钥攻击卡在第三步摘要碰撞攻击卡在第一步伪造证书卡在证书验证那一步。死记单点概念答不出这类题。5. 易漏点五处最容易记反、讲混的地方5.1 钥匙方向记反加密用公钥、签名用私钥易漏点把「用公钥加密」和「用公钥验签」混成同一件事考试时写成「用私钥加密消息、公钥解密」或者「用公钥签名、私钥验证」。为什么漏两个方向的动词都是「加密」和「解密」形式上高度对称而且性质 c 明确写了「用公钥可以解开私钥加密的信息反之亦成立」从纯数学角度两个方向都成立光看数学看不出该用哪个。怎么补不要从数学记从目标记。保密的目标是「只有对方能看」那就必须用对方的公钥锁上只有对方的私钥能开证明的目标是「只有我能生成、所有人都能验」那就必须用我自己的私钥生成所有人都能用公开的公钥验证。把「要保密用对方公钥、要证明用自己私钥」当口诀写在笔记首页每次做题前默念一遍两三次就能固化。5.2 把 Hash 摘要当成加密易漏点认为摘要是「加密后的消息」认为拿到摘要可以「解密」回原文或者认为摘要能当保密手段用。为什么漏Hash 和加密在流程图上都是「输入一段数据、输出另一段数据」视觉上太像再加上签名流程里摘要确实被送进了私钥运算更容易被误解成某种加密。怎么补抓两条本质差别。其一加密是可逆的有密钥就能还原Hash 是不可逆的没有任何密钥能把摘要还原成原文它只是指纹。其二加密的目的是保密Hash 的目的是校验完整性两者服务的目标完全不同。顺带记住摘要不是定长就没有比对价值抗碰撞性不够就挡不住伪造这两个性质缺一不可。5.3 以为「签了名就等于内容保密」易漏点看到一封带数字签名的消息就默认内容只有收件人能看忽略消息正文其实是明文。为什么漏签名和加密经常成对出现在真实系统里也常常一起用于是被合并成一个动作记再加上「用私钥处理过」这个印象容易让人误以为处理过的内容就被保护起来了。怎么补把两者拆成两条独立的能力来记。签名管的是来源和完整性加密管的是保密性可以只签名不加密也可以只加密不签名还可以先签名再加密。判断一个方案是否安全要分别问两句内容别人能不能看来源别人能不能冒充两问都过才算完整。这个拆法在分析实际协议时特别有用很多设计缺陷就是把这两件事当一件做了。5.4 验证书只看签发者不查域名和有效期易漏点拿到证书只确认「是不是某 CA 签的」签名一验通过就认为可信忽略域名匹配、有效期和吊销状态。为什么漏证书验证的核心动作确实是验签验签通过给人的心理反馈很强容易就此收手而域名、有效期这些字段看上去只是元信息不像签名那样有「密码学含量」。怎么补把证书校验整理成四项固定检查签名链是否完整并能上溯到信任锚、有效期是否覆盖当前时间、证书主体或备用名称是否与访问地址匹配、吊销状态是否正常。四项里任何一项不过都应视为不可信。这四项可以做成一张检查卡排查线上问题时逐项打勾比凭印象靠谱得多。5.5 把「计算上不可行」说成「很难但理论上可能」易漏点描述「由公钥推私钥」时用「概率很小」「理论上还是有可能」这类表述把安全强度的定义讲偏。为什么漏日常语言里「困难」和「不可能」经常混用而性质 d 的原话是「很困难或者是不可能的」两种说法并列出现记忆时容易只留下模糊印象。怎么补抓住「计算可行性」这个限定词。安全性陈述的完整形式是在给定的计算资源和时间尺度下由公钥推私钥的计算量不可接受因此视为不可行。这不是概率事件而是复杂度问题。答题时把「计算上不可行」这五个字写全比写「很难推出来」得分稳。顺带记住这类安全性判断会随算力变化而调整参数所以密钥长度不是一劳永逸的设定。6. 复习清单六个自测问句和一次默写这一块最怕的是「看懂了但说不出来」。把下面这张表盖住右列只看左列自问自答能一口气答完再往下走答不顺的地方就是漏点回头翻对应小节。知识点一句话答案自测问句单钥加密的命门密钥保存与分发泄漏即全盘失效为什么对称加密的密钥数量是人数平方级双钥的四条性质一一对应、互不相同、互为逆向、正算容易反算不可行哪一条是安全性的根基加密与签名方向保密用对方公钥证明用自己私钥为什么不能反过来摘要的作用把任意长度压成定长指纹供签名运算为什么不直接对全文签名签名覆盖范围来源、完整性、不可否认不含保密与公钥归属签名能不能替代证书证书验证四项签名链、有效期、域名匹配、吊销状态哪一项最容易被漏掉除了自测表还有三个查漏补缺的动作值得固定下来。第一个动作是默写链路拿一张白纸从消息、摘要、签名、证书、信任锚一路写到验签比对中途不许翻书。写不下去的位置就是理解断层比刷十道选择题都准。第二个动作是对着证书字段表看一张真实证书用前面那两条命令把字段打出来逐个字段说出它的作用说不出的当场标记。第三个动作是给自己出一道反向题假设攻击者控制了某一环会导致什么后果、由哪一步防住。这个练法能把散点知识压成因果链。注意复习时不要只背「公钥」「私钥」这两个词的定义要把它们放进「谁生成、谁持有、谁使用、防住什么」这四个格子里各填一遍填不满就是没吃透。我自己的教训很具体第一次复习这部分内容时我能把签名流程背得很顺却在被问到「证书里到底验的是哪一段」时卡住因为我一直是把证书当成一个整体黑匣子记的从没拆开看过字段。从那以后我每次复习密码学都强制走一遍「先默写链路、再拆字段、最后出一道攻击假设题」这三步哪怕只花二十分钟也比通读一遍材料扎实。这套流程坚持下来那些原本靠语感蒙过去的地方会一个个现形。希望帮到你。本文还有配套的精品资源点击获取