确认信件是真的,签名
上一课我们看到,公钥锁上的只有配对私钥才能开。可有时消息不必保密,你只想确认它真的出自那个人。要是有人借用他的名字寄了封假信呢?要是寄件人用只有自己有的私钥,在消息上留下一个像印章的标记,而任何人都能用那个人的公钥确认这个标记是真的呢?
若不知道是谁发的
假设来了一封信。
末尾写着某个人的名字。
可那真是那个人写的吗?
名字谁都能照着抄。
内容也可能被谁悄悄改过。
光看字是没法分辨的。
这不是保不保密的问题。
内容全摊开也没关系。
你只想知道它是不是真的出自那个人,
来的路上有没有被改动。
看看只写了名字的信。光凭文字分不出名字是不是抄的,内容有没有被改。
自己点一点就觉得别扭。
就算写了名字也没法确定。
被改过的信看着也好好的。
我们需要两样东西。
一,它真的出自那个人的证据。
二,来的途中没被改动的证据。
最好有一个标记能一次显示这两点。
而且必须是别人模仿不来的。
好在上一课的那一对钥匙
正好能办成这件事。
用私钥签名
上一课你是用收件人的公钥上锁。
签名方向相反。
寄件人用自己的私钥。
用私钥给消息附上一个签名。
这不是用挂锁上锁。
更像是在消息旁边盖一枚印章。
内容照样全看得见。
只是那枚印章会一起跟着走。
因为私钥只有那个人有,
这枚印章只有那个人能盖。
点一下私钥给消息附上签名。内容照样看得见,一枚只有那个人能做的印章一起跟着走。
一点私钥,签名就附上了。
消息的字一个都没被遮住。
因为不是上锁,只是加了印章。
这个签名和消息内容是绑在一起的。
正是这一点在下面变得重要。
而要盖这枚印章,
就必须有那个人的私钥。
私钥从不离主人的手,
所以别人做不出一样的印章。
那么收到的一方怎么确认这个呢?
用公钥验证
收件人用那个人的公钥。
公钥,记得吧,对谁都开放。
用那把公钥来验证签名。
验证就是问一个问题。
这枚印章真是用那把私钥盖的吗?
是的话,验证就通过。
公钥和私钥是一对,
所以只有这一对配上了才通过。
用不相干的人的私钥盖的印章,
对着那把公钥验证就会失败。
用那个人的公钥验证几个签名。只有配对私钥盖的那个通过,别的失败。
只有配对私钥盖的签名通过了。
用错钥匙盖的全失败了。
通过的意思很清楚。
这条消息真的出自那个人。
公钥让全世界都拿着也没事。
用公钥只能验证,做不出签名。
盖印章的权限只属于私钥的主人,
而确认印章对谁都开放。
这正是上一课上锁的镜像。
不过通过说的不只是真实性。
是真的,也没被改
签名和消息内容牢牢绑在一起。
所以验证通过一次说出两件事。
一是真实性,它真的出自那个人。
二是完整性,一个字都没变。
要是途中有人把内容稍微一改,
它就和绑着的签名对不上了。
于是验证立刻失效。
变了的一个字就成了警报。
所以通过既意味着是真的,
也意味着来的路上没被动过。
改一下已签名消息的一个字。和内容绑着的签名对不上了,验证就破了。
只改了一个字,
验证立刻就翻成失败了。
因为绑着的签名对不上了。
收件人看到这个失败就明白,
这已经不是原来的样子了。
于是可以停下,而不是随便相信它。
正是这个破裂守住了完整性。
不会被骗着把改过的消息当真的。
真实和完整,一枚印章一次守住这两样。
现在把上锁和签名并排理一理。
来理一理
归成一句话,是这样。
数字签名把公钥密码反过来用。
寄件人用自己的私钥给消息签名。
收件人用那个人的公钥来验证。
通过的话,就一起证明了它真的出自那个人,
而且来的路上没被改动。
上锁是把内容保密,
签名是证明谁发的、有没有被改。
同一对钥匙,只换个方向,两件事都能做。
上锁为了保密,签名为了真实和完整。
点一下上锁和签名对比。上锁为保密,签名为真实和完整,一句话看出差别。
现在你知道了上锁和签名的区别。
上锁守住秘密,
签名证明是真的、没被改。
两者都出自同一对钥匙。
用收件人的公钥上锁就是保密,
用寄件人的私钥签名就是真实和完整。
一个方向就分出了用途。
不过验证要成立,有一个前提。
那把公钥必须真是那个人的。
怎么相信那把公钥,是下一个故事。