为什么要加密
假设一封信不装信封,要经过好几个人的手才能送到。中途接过信、再往下传的人,个个都能原样读到内容。不做任何处理就通过网络发出的消息,正是这样一封信。加密就是把这封信变成没有钥匙就读不懂的乱码。中途就算有人截走,也看不出写的是什么,只有拿着正确钥匙的人,才能把它还原成原文来读。
直接发出的文字谁都能读
消息并不是直接送到对方那里,而是先后经过路由器、运营商设备、中继服务器等好几个中间站点才到达。文字不做任何处理就原样发出,一路上经过的每一站都能读到内容。
这种没动过的原始文字叫明文。明文就像没装信封的信。
把路上的中间站点一个个点开。因为是明文,每一站都能原样看到内容。
不管点哪一站,看到的都是原样的同一段文字。大多数站点只是把收到的东西转出去,可只要有一处起了心思,就能读到、抄走内容,这才是问题。公共 Wi-Fi 这种不知道是谁在运营的路,就更是如此。
想到密码、卡号就这样一路经过,不禁让人捏一把汗。所以发出之前,要先把内容锁上,让别人读不懂,这个上锁的过程就是加密。
一上锁,就成了没意思的字
加密就是按照既定的方法,把明文打乱成读了也看不懂的文字。锁上的文字叫密文。密文里也看得到字,但意思已经没了,只是一团乱码。
打乱的方法要和钥匙配对使用。同样的方法,钥匙不同,得出的密文就完全不同;只有拿着那把钥匙,才能把它解回来。
点“上锁”,给明文加密。原本读得懂的文字变成了没意思的密文。
一点“上锁”,清楚的文字就变成了认不出来的字符。内容并没有被抹掉,而是锁了起来,没有钥匙就读不了。这里就能看出它和哈希的区别:哈希做出的是无法还原的指纹,而加密只要有钥匙,就能还原成原文。
那么,这团乱码怎样才能变回原文?答案在上锁时用的那把钥匙上。
只有正确的钥匙才解得开
想重新读锁上的密文,就得用钥匙解开,这叫解密。插上正确的钥匙,乱码就变回原来的明文,就像用配套的钥匙打开锁一样。
插错钥匙就解不开。所以只有拿着钥匙的人才能看到内容,中途没有钥匙的人,谁也没法把密文还原成明文。
选一把钥匙,再点“解开”。钥匙对,原文就回来了;钥匙不对,就解不开。
用正确的钥匙,原文回来了;用错的钥匙,就被挡住了。正是这一点让加密有用。上锁的方法本身广为人知也没关系,反倒是公开出来、经过许多专家长期检验的方法更可靠。
真正的秘密只有钥匙。方法公开、只藏钥匙,这条原则叫柯克霍夫原则。那么,上锁和解锁在现实中究竟在哪里保护着我们?
传输时守,存储时也守
加密守护秘密的地方主要有两处。第一是传输中:消息穿过互联网、经过那些中间站点时,如果加了密,截走它的人手里只有密文。
第二是存储时:文件和数据静静地放在手机或服务器上,一旦设备丢了或者服务器被攻破,也可能被人偷看。加密后再存储,没有钥匙就读不了存下的内容。
轮流点“传输中”和“存储时”。不管哪种情况,偷看的人拿到的都只有密文,内容就守住了。
不管是传输中还是存储中,加了密的文字没有钥匙就只是一团乱码。重要的数据,发送时要锁,存储时也要锁,两头的秘密才都守得住。不过,加密只能让人读不懂内容,单靠它并不能证明消息是谁发的,也不能保证途中没被改过。这个问题后面会用数字签名来讲。
还剩一个问题:上锁、解锁都少不了的那把钥匙,收发双方要怎样安全地共享?
小结
归纳起来是这样:直接发出的明文,路上谁都能读。加密用钥匙把明文锁成没意思的密文,只有正确的钥匙才能解开,所以只有拿着钥匙的人才看得到内容。
这样一来,传输时和存储时的秘密都守住了。上锁的方法可以公开,秘密全在那一把钥匙上。
依次点要点回顾一下。(明文会被偷看 → 上锁成密文 → 只有正确的钥匙才解得开 → 守住传输和存储)
现在你手里有了守护秘密最基本的工具:上锁,只用钥匙解开,发送时和存储时都要守。可是锁再好,钥匙随手乱丢也没用。
下一课来看用同一把钥匙上锁和解锁的对称加密,同时会碰上一个棘手的问题:怎样把这把钥匙交到远方的对方手里。