跳过正文
  1. Docs/

This Is a Test Page

2232 字·5 分钟·
目录

背景
#


我们在上一篇文章“RSA加密算法中”,分别以上帝视角和中间人视角亲身经历了一次加密传输信息的过程。但是这个过程中仍然存在漏洞。现在假设我们作为一个中间人,根据加解密的过程,我们也可以通过公钥来加密自己的明文传给那位女生,并且把那位男生想要发给女生的密文扔掉,简言之,我们可以截获密文,并且伪造发送者的身份。这怎么行?万一有个捣蛋鬼把情书改成“我讨厌你”那不就完蛋了?所以我们需要对消息进行“签名”。

“签名”,顾名思义,就是证明这段消息确实是我发送的,接下来让我们谈一谈男生怎么对自己的情书进行签名。

实践-签名
#


  • 你:(假设你跟上一篇文章一样依旧是那位男生)

    1.也生成一对RSA密钥,私钥留着你自己知道,公钥公之于世。参数分别记为$n_2,e_2,d_2$

    2.计算你要发的消息的摘要哈希值,(这里就拿上一篇文章的$m$作SHA-256,哈希验证应该知道是干什么的吧)

    h_m = 0x7574f4f50ec0973f20f56bd367163c5bf0e1a251df91dfa4241031644d80e417
    

    3.把哈希值用你的私钥加密,生成签名$s$

    $$ s=h(m)^{d_2} \space \mathrm{mod} \space n_2 $$

    4.把消息$m$用女神的公钥​$(n_1,e_1)$加密成$c$、连同签名$s$一起发送给女神

  • 女神:收到了你发给她的$c,s$​

    1.首先她迫不及待地用自己的私钥解密消息内容得到明文$m$,知道了你要说什么。

    2.接下来需要验证这个消息确实是你发给她的,她用你的公钥​$(n_2,e_2)$​解密连同明文一起收到的$s$,得到了一串数字,根据签名的算法,这串数字应该是$h(m)$​

    3.然后女神自己把收到的明文$m$也按照一样的算法计算哈希值$h^\prime (m)$,发现与$h(m)$恰好相同

    4.如此一来,女神收到了你的消息、也知道这个消息确实是你发的,并且未经篡改。

也许你看到这里还不大明白为什么需要这么麻烦,接下来来点刺激的,我们知道经过这样的签名后,消息除了能被还原以外,还多了两个特征,即:“确实是你发的”和“消息没有被篡改”,接下来我们作为中间人,分别尝试更改消息的发送者,以及尝试篡改消息。

实践-伪装发送者
#


我们看到这位男生想发送密文$c$以及签名$s$给女生,我们心生怨念,决定把表白人改成自己,强行绿了人家!(这种做法不道德,千万不要在现实世界有这样的想法哈,我也是曾受其害的)

首先看看密文$c$,因为加密生成这个密文$c$的公钥是$(n_1,e_1)$,我们都知道。但是我们现在要尝试把表白人改为自己,要签我们的名字,所以搞$c$是没有用的。

那么再来看看$s$,因为根据公开的算法,签名$s$由明文的哈希值和男生的私钥生成。好家伙,这两个东西我们都不知道,这个签名没有办法改成自己的啊。所以很遗憾,这个签名我们伪造不了。

实践-篡改消息
#


既然改不了签名,我们就让他丢面子!改了他的情书!

情书被加密成$c$,我们重新写一段话并编码:

"You stupid woman, I hate you!"
m' = 2411173100906658110738417293960117700950878599448207741059556935955745

再把$m^\prime$用女生的公钥加密生成$c^\prime$,在此之前,也计算出哈希值$h(m^\prime)$备用。

接下来就是签名,$s^\prime=h(m^\prime)^{d_2} \space \mathrm{mod} \space n_2$

坏了,$d_2$只有男生自己知道,我们搞不出来签名。你们肯定都知道我用我自己的私钥来签名更是不可行的,非但达不成目的,并且搞不好那个女生心细,把大家的公钥一个一个拿来试,说不定我们还会被抓到。

诶,这里的签名更改不了,说明了什么呢?稍后告诉大家。

分析
#


所以我们都看到了,对消息签名了以后,改签这个名的人的话需要消息明文的哈希函数,可惜我们搞不到。改消息内容的话,我们知道了哈希函数,但是没有那个男生的私钥签不了名。

肯定有傻乎乎的读者想到了另一个办法:两个都改了!

你逝逝,两个都改了不就相当于我们发送了改过的消息,签上了我们自己的名字,哈哈哈哈,属于逝做坏事并且同时自首了。而且也影响不了男生发消息啊。

诶,有读者还没明白,我怎么就自首了呢?这就是签名的另一个作用了:保证你“君子一言,驷马难追”,这叫“不可抵赖”。

实践-“我说过这话?”
#


这样吧,你再当回那个男生。假如你很害羞,用这么隐蔽的方式发送了情书给你心爱的女神,女神收到了,但是你不知道她心里很开心,甚至你还以为她会找你麻烦。好巧不巧,下课了女神找到了你,并且发出了灵魂拷问:“你真的喜欢我吗?”。好家伙,大家都还没走呢,你被这场面吓到了,于是你想撒个谎:“我……我没有,那是……是别人的恶作剧吧,啊……哈哈哈。”女神听你这么讲,差点没笑死,说:“怎么就害羞了呢?”

她把收到的签名用你的公钥解密,得到了一串哈希值,然后再把情书哈希一下,二者果然是相同的。

这下你不得不承认表过白了吧~

用你的公钥解密,得到了正确的结果,说明签名一定是用你的私钥加密而来的,全世界只有你自己有你的私钥,不是你签名的还能是谁?

总结
#


我们看到,上次介绍的RSA加密算法可以保证明文不被泄漏,今天使用的RSA签名算法既可以保证你想发送的信息不被篡改,还可以保证这个消息确实是你发出的,你想抵赖都抵赖不掉。

我们在这几次的实践中知道了密码学的目的:

  • 保密性:加密的密文别人不能破解为明文
  • 完整性:你发送的密文一旦被中间人篡改掉或者有某些技术原因导致遗失掉接收者可以发现,即确保信息掌握在你们的手里。
  • 身份验证:今天学到的签名算法可以保证你是信息的发送者,别人不可以冒充你
  • 不可否认:你签名、发出的信息一定是你发出的,别人可以指证,你事后想抵赖都抵赖不掉。

虽然结尾你的害羞和你的私钥出卖了你,但是女神没有计较,你也如愿以偿和她在一起了。

所以快说:谢谢密码学!

Someijam
作者
Someijam
墨香留痕思深意,字里行间见真知。阅文易有雅兴至,愿君难得赞评离。