💻 第十章 试着加密数据吧
📄 一句话概括

把公开密钥反过来用:私钥签名、公钥验签——能验过就是本人所发且未被篡改,保密与认证在一张钥匙对里全齐了。

📝 本节和前面几节的关系

公钥私钥解决了保密,本节把同一对钥匙倒过来用,解决另一个问题:怎么证明消息真是【他】发的?

一、签名的原理:反过来用

签名时用自己的私钥处理消息——只有本人握有私钥,处理结果就是身份凭证; 任何人拿对方的公钥验签:还原成功即证明消息出自私钥主人,且内容一字未改; 注意分工反转:加密是【收件人公钥上锁、私钥开】,签名是【发件人私钥落笔、公钥核对】。

二、签名为什么也防篡改

消息改一个字,用同一私钥伪造新签名?伪造者没有私钥,做不出合法签名; 把旧签名配新消息去验:还原结果对不上——篡改当场穿帮; 实战里先对消息算摘要(哈希,一串固定长度的指纹)再签摘要——消息再长签名也固定,改一个标点指纹就变。

三、从签名到数字证书

签名能证明【私钥持有者发的】,但【这把公钥真属于声称的人吗】还有一问; 数字证书由可信第三方(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. 解释为什么签名前要先把消息压缩成摘要(消息太长签不动+指纹更灵敏)。

常见误区

  1. 以为签名就是把手写签名扫描进电脑——数字签名是私钥运算,与笔迹无关。
  2. 以为验签通过就万无一失——它只证明私钥持有者所发;公钥本身的归属还要数字证书背书。
自测三问(点开对答案) 1. 签名与验签各用哪把钥匙? —— 签名用发件人私钥,验签用对应公钥。 2. 签名同时证明什么? —— 发送者身份+内容未被篡改,一体两面。 3. 摘要(哈希)在签名里起什么作用? —— 把消息压成固定长度指纹——消息再大签名也固定,篡改必现形。

相关笔记