Shell's Home

Jan 25, 2011 - 1 minute read - Comments

从快递说非对称密码学

这两年快递评价很差,听说有基层员工冒充客户签名偷货物的。今天我们不说快递的问题,只是简单的讨论一下,如果快递公司管理层有心改变这种局面,他们有什么办法。

首先采用的方案是要求基层员工送货到门,必须本人签名,核对签名等。不过这对冒充客户签名没有任何帮助。因为基层员工一旦参与此事,什么送货到门的规矩,本人签名的规定,都是一句废话。核对签名是个废话中的废话,因为在仲裁的时候,基层员工得到的签名不对,并不能作为他故意将货物交给别人的证据。还不明白?如果客户不提前留下签名,最后的送货员可以辩解说,我又不知道收货人签名张啥样,给签就给收呗。如果客户提前留下签名,那么送货员可以仿冒一个。

同样,密码也有一样的困境。如果给送货员密码,等于没有防护。如果不给,等于没设定。

对于这种现象,可行的解决方案有二。

一种是让每个送货人携带一个终端,当客户取货的时候,必须输入预先设定的密码。如果密码持续试错,则该件锁定,交由收货人重新设定密码。这种做法的好处是原理简单明了,又能达成目标。送货人如果想要冒充收获,就必须反复尝试密码。多数情况下都是无法试出的,于是收件人收到一个警告,要求重设。这样的密码试出机率几乎是0。而收件人自己设定一个密码就可以收件,如果忘记可以重设。

但这种方法弊端也很明显,送货人要多携带一个终端,并且收件时必须保证终端通畅。不说终端部署的费用,在很多地方,指望通讯通畅是一件非常奢侈的事情。

第二种方法,就是让收货人提供一个问题,自行保留一个答案。这个问题和答案必须有几个特征。1.知道问题,是无法推出答案的。2.可以很简单的验证答案是否解答了问题。3.评判标准简单,不存在模棱两可的答案。4.问题和答案都便于生成和操作。

我们来看一下,为什么这样可以阻止送货人冒充客户收货。如果送货人要冒充收件人收货,就必须知道问题的答案。但是根据1,他是推不出答案的。而当收件人收货的时候,他给出的答案是很容易验证的。当然,其实这样就满足了要求。但是如果没有4条件,这个过程只能做一次,对于大量重复的快递工作是没有任何帮助的。

如果忽略去第四点,我们可以提供这么个问题和答案。一个1000位的质数和1000位的质数相乘,大概能得到一个1999-2001位的合数。这个合数能唯一的分解因数,求两个因数。问题很简单,但是根据目前的水平,要解出这个问题需要大量的计算资源。至少一个计算中心跑个几年是跑不出结果的。很明显一个送货的不可能随随便便解出这个问题的答案。但是如果收件人提供了两个质数,我们不说输入难度,要验证两个数相乘是否得到合数只需要一台手机一两秒的时间。至于一个数是不是质数,有一个概率算法叫做Robin-Miller算法能够解决(当然,实际用的都是略有变形的),验证起来也不过是几秒的时间。

这个方案无疑是很不错的,但是有一个致命的问题。要进行答案验证,就必须输入两个质数和合数。加起来大概有4000位的数据,输入起来会让人绝望的。在实际的快递中,这种方法没有任何应用价值。

但是对于类似快递的电子邮件系统,电子商务交易,在实际操作的时候数据交换和计算设备都绝对不是问题。因此,这类方法在电子商务上有非常重大的用途,说是电子商务的基石也毫不为过。

这类算法就叫做非对称密码算法,所谓非对称,指的是加密和解密过程使用的两个密钥不相等,又互相关联。其原理是当今世界最顶尖数学问题之一的“P和NP问题”,位列希尔伯特23问题和千禧年八大数学问题之中。能同时列入的都是对世界产生深远影响的重要数学问题,例如黎曼猜想。其实从理论物理角度,有一样东西更容易满足非对称验证的特性,就是两个处于纠缠态的基础粒子。如果我们忽略两个纠缠态量子怎么传递的问题,理论的想象,其中一个基础粒子跟随箱子,而另一个基础粒子在收件人手里。验证就是非常简单的问题了。干涉一个基础粒子到某个特定偏振态,使用一束光同时通过两个粒子。如果两个粒子处于纠缠态,那么光子在通过两个粒子的时候,粒子一定处于同一偏振状态。如果是非纠缠态的两个粒子,则光子输出的时候会比纠缠态量子有更大的吸收幅度。这个系统最完美的一点是,纠缠态的量子是绝对无法复制的东西,除非违背量子力学。不过从实际角度考虑,不说我们尚未成功在实验室里做到这一系列事情。单是让箱子携带一个基础粒子就是一个扯淡到不能再扯淡的事情。

当然,在快递中没有采用非对称算法的主要原因并不是因为实现困难,而是管理层根本无心改变这种局面。关于这个问题,我们在另一篇“快递战争”中讨论。