📄 一句话概括
把公开密钥反过来用:私钥签名、公钥验签——能验过就是本人所发且未被篡改,保密与认证在一张钥匙对里全齐了。
📝 本节和前面几节的关系
公钥私钥解决了保密,本节把同一对钥匙倒过来用,解决另一个问题:怎么证明消息真是【他】发的?
一、签名的原理:反过来用
签名时用自己的私钥处理消息——只有本人握有私钥,处理结果就是身份凭证; 任何人拿对方的公钥验签:还原成功即证明消息出自私钥主人,且内容一字未改; 注意分工反转:加密是【收件人公钥上锁、私钥开】,签名是【发件人私钥落笔、公钥核对】。
二、签名为什么也防篡改
消息改一个字,用同一私钥伪造新签名?伪造者没有私钥,做不出合法签名; 把旧签名配新消息去验:还原结果对不上——篡改当场穿帮; 实战里先对消息算摘要(哈希,一串固定长度的指纹)再签摘要——消息再长签名也固定,改一个标点指纹就变。
三、从签名到数字证书
签名能证明【私钥持有者发的】,但【这把公钥真属于声称的人吗】还有一问; 数字证书由可信第三方(CA)出面对公钥签名背书——证明公钥的归属; 【⚠️ 2026 现状】软件更新包、PDF、HTTPS 证书全是这套流程;19 课第五章把签名与证书一起展开——本章已把主干思想拿下。
四、动手 Demo:私钥签名、公钥验签、篡改穿帮
继续用玩具 RSA:本人签名后验签通过;签名被篡改一比特,验签当场露馅。
n, e, d = 33, 3, 7
msg = 5
sign = pow(msg, d, n)
print("签名:", sign)
print("验签:", pow(sign, e, n), "== 消息", msg)
bad = 6
print("篡改后验签:", pow(bad, e, n), "!= 消息", msg)
实跑输出:
--------------------------------------------------------------------
数字签名可以证明数据的发送者是谁
--------------------------------------------------------------------
把上一节的钥匙倒过来用: 私钥【签名】, 公钥【验签】——
私钥只有本人有, 验签通过就证明【这消息确实出自本人, 且没被改过】:
[本人签名]
用私钥签名: 消息 5 -> 5^7 mod 33 = 14
收件人验签: 14^3 mod 33 = 5 == 消息 5 验证通过
[中途有人篡改签名成 6]
再验签: 6^3 mod 33 = 18 != 消息 5 穿帮!
加密与签名正好是一对镜像:
用途 用哪把锁 对方用哪把开
---------------------------------------------
保密(加密) 收件人的公钥 收件人的私钥
认证(签名) 自己的私钥 自己的公钥
真实签名还会先对消息算【摘要】(哈希)再签——消息大也不怕,
改一个标点摘要就变, 篡改无处遁形。
【⚠️ 2026 现状】软件更新包、PDF、电子邮件的数字签名全是这套流程,
19 课第五章把它和数字证书一起展开。
签名 5 的 7 次方对 33 取余;验签把结果再用公钥乘方——还原出 5 即通过。 把签名改成 6 再验,得到 6 的 3 次方取余不等于 5——篡改藏不住。
30 秒实验
- 用一句话说清【加密】与【签名】谁用谁的哪把钥匙,最好画成两行对比。
- 解释为什么签名前要先把消息压缩成摘要(消息太长签不动+指纹更灵敏)。
常见误区
- 以为签名就是把手写签名扫描进电脑——数字签名是私钥运算,与笔迹无关。
- 以为验签通过就万无一失——它只证明私钥持有者所发;公钥本身的归属还要数字证书背书。
自测三问(点开对答案)
1. 签名与验签各用哪把钥匙? —— 签名用发件人私钥,验签用对应公钥。 2. 签名同时证明什么? —— 发送者身份+内容未被篡改,一体两面。 3. 摘要(哈希)在签名里起什么作用? —— 把消息压成固定长度指纹——消息再大签名也固定,篡改必现形。- ☐ 下一章(第十一章 XML究竟是什么)
相关笔记
- 在签名中运用公开密钥加密技术 — 签名的完整数学在那边
- 为软件添加数字签名 — 装软件时的签名验证就是本节
- 💻 计算机是怎样跑起来的 · 索引