前面我们看到,签名具有不可伪造性,因此签名者可以很好的证明自己的身份。事实上,由于签名是不可伪造的,因此签名还有一个重要的功用。当一个人对某份文件进行签名后,这份文件便具有了法律效应:你今后无法再否认你签过这份文件,因为别人是不能伪造签名文件的。签名的这种性质叫做“抗抵赖性”。
在实际生活中,签名的抗抵赖性用的最多的场合就是签合同了。为了防止一方今后毁约,双方可以要求对方在合同上签名。此后,合同签署人的行为将受到这个签名文件的限制。一旦签名者想毁约,利益受到侵害的人便可以拿着这份合同大闹法庭,高举这份文件大叫“当初他签过名的”。
当签名用于抗抵赖时,新的问题产生了。签名的法律效应是如此之高,以至于人们往往不敢随意签名。一份合同往往同时规定了双方的权利和义务,并需要双方都在上面签名。第一个在上面签字的人就会觉得很亏:万一我签了字后对方突然翻脸耍赖不签了咋办?即使合同上规定“合同仅在双方均签署之后才有效”,这个问题仍然存在,因为后签名者将具有绝对的主动权,他想什么时候签就什么时候签,而只有他的签名才具有决定意义。因此很多时候,双方都希望能够在对方签名之后自己再签名,从而获得一些安全感。这里我们来探讨一个有趣的问题:有没有什么办法能够让双方同时签约,使得双方签名时都能确保自己的利益安全?
如果我们谈论的是传统意义上的签名,同时签名当然是有可能办到的:双方只需要拿起各自的笔,同时在文件上写下自己的名字即可。当然,事实上肯定不会有人这么做。试想这样一个荒唐的画面:两个西装笔挺的人挤在一起,两只手臂磕磕碰碰地交错在一起,然后双方同时喊“三、二、一”并一起开始写字……比起自己丢掉的脸面,自己先签名所带来的忧虑还算个屁啊。
有没有体面一些的,不那么荒唐的同时签字法呢?这里有一个很有启发性的办法。合同双方面对面地坐在桌子的两端。其中一个人在合同上写下自己姓名的第一个字母,然后传给坐在对面的第二个人;第二个人写下他自己名字的第一个字母,然后又回递给第一个人;第一个人签下自己名字的第二个字母,又交给对方要求对方写下自己的第二个字母……以此类推,直到双方都签署完自己的名字为止。为了让双方能够“同时”签完,名字较长的人偶尔可能需要连续写下两三个字母。
双方都愿意履行这一协议,因为在这个协议下双方是一点一点地签完整个文件的。第一个写字的人不会觉得自己很亏,因为写下一个字母是远不具备法律效应的;如果对方拒绝签他的第一个字母,我可以当即撕毁合同。虽然他们都不知道,究竟要写多少个字母才算签字,但大家都保持自己签下的名字长度与对方基本相当,因此不会担心对方突然放弃协议。就在这种互动的心理过程中,签名的法律效应一点一点地增强,直到最后双方写完自己的名字。
密码
身份验证、中间人攻击和数字签名:浅谈密码学(中)
事情还没有结束呢!我们前面假设,大家公开公钥的方式是“发布在一个众人可信的网站上”,这种假设是有原因的。需要临时交换双方公钥的通话协议是不安全的,这里面存在一个戏剧性的漏洞。举个例子,假如A和B认为,任何网站都是不可靠的,他们从未并且今后也不会在网上公布自己的公钥。为了加密通信,A需要亲自告诉B他的公钥,B也需要亲自告诉A自己的公钥。收到公钥后,双方便用对方的公钥加密进行数据传输。因为用这个公钥加密后,只有对方才能解开密码,因此双方都认为这条通信线路是安全的。其实,他俩的麻烦大了。这条线路并不是安全的,第三者可以用一种很搞笑的方式来窃听消息。假设有一个人C知道A和B之间将有一次加密通话。C劫持了A和B之间的通讯线路。现在,A把他的公钥发给B,这个公钥传到一半时被C拦截下来,于是C获得了A的公钥;C再把他自己的公钥发给B,让B把C的公钥错当成A的公钥。同样地,B把他自己的公钥发给A,被C拦截下来。C把自己的公钥发给A,让A以为那是B的公钥。以后,每当A给B发加密消息时,A其实是用C的公钥在加密;C把A的消息解密后,再用B的公钥加密后传给B。类似地,一旦B给A发送消息,C都可以将消息解密,并用A的公钥进行加密后传过去。此时,A和B都以为自己在用对方的公钥加密,并都能用自己的私有钥匙解开对方传来的密文;殊不知,这中间有人仅仅用了一点雕虫小技,无声无息地窃走了所有的信息。C正是利用了公钥加密术“谁都可以加密”的性质,结结实实地玩弄了A和B。这种攻击方法叫做“中间人攻击”。
这让我想起了经典的国际象棋骗术。一个象棋白痴宣称自己是个大牛。为了证实这一点,他将要与两位大师同时对弈。他说,我先下后下都能赢。于是,在与大师A的对弈中他为白方,与大师B对战则执黑。结果呢,两盘比赛下来居然都打成了平手。怎么回事呢?其实那个象棋白痴耍了个小伎俩,他把大师A走的棋记了下来,跑到另一边去下给B看,又把B的应着原封不动地搬到了和A的棋局上。来来回回搞了半天,他自己只起了个传递信息的作用,真正在对弈的是两个大师。
身份验证、中间人攻击和数字签名:浅谈密码学(上)
说到“密码学”,大多数人的第一念头或许是Morse电码、Ceasar移位密码、同音替换密码之类的东西。这些东西在各类小说中都已是老面孔了,“字母e在英文中出现频率最高”这一最基本的破密码方法已经是耳熟能详了。几天前和网易的云风聊了一下,突然体会到了密码学的真谛。密码学关注更多的并不是加密解密的各种数学算法,而是在已有数学算法上如何实现各种安全需求。防止消息泄露只是众多安全问题中的冰山一角,而这个问题本身又有很多复杂的变化。
当我们谈到“消息泄露”时,我们头脑中想到的往往是,在信息传输过程中如何防止第三方截获。当然,小偷防是防不住的,不过我能保证他偷到东西也没用。双方只需要事先约定一套加密函数和解密函数,以密文的方式进行传输,这样便能很好地防止消息泄露。但有时候,“消息泄露”的内涵复杂得多,加密解密的传统方法并不适用。考虑这么一个问题:10个人坐在一起谈天,突然他们想知道他们的平均年薪,但又都不愿意透露自己的工资数额。有没有什么办法让他们能够得出答案,并且不用担心自己的年薪被曝光?事实上,最简单的解决办法不需要依赖任何密码学知识:第一个人随便想一个大数,比如880516。然后他在纸条上写下这个数与自己的年薪之和,传给第二个人;第二个人再在这个数上加上他的年薪数额,写在另一张纸条上传给第三个人;直到最后一个人把纸条传回第一个人后,第一个人把纸条上的数减去只有自己知道的那个880516,便得到了全部10个人的工资和。
Original Ideas
首先呢,小小的庆祝一下我的订阅数终于过千了。真可惜,昨天的订阅数1023,差一点就是1024了……
最近不知道为什么,思维特别活跃,脑子里经常蹦出一些牛B的想法。先声明,这篇文章为matrix67.com原创;谁要是用了里面的东西而没署名,或者拿去用作商业用途的话……Alan Shore的模样将会像幽灵一样缠绕着你,出现在你的每一个恶梦中。
关于输入法:为什么能打出“推倒”却打不出“推不倒”?
为什么没有输入法可以依据语法规则生成更多词组?例如,我可以把“睡觉”、“理发”、“洗澡”、“打球”、“吃饭”一类词做一个标记,那么在里面插入“了”、“过”等词也可以直接视为一个词(这些词同样很常用)。这样的话,词库容量大大扩充了,但这种方法本身并不耗费太多的空间和时间。
或者有输入法已经开始这么做了?大家的输入法中,这些词语可以直接打出来么?
睡觉 睡了觉 睡过觉 睡个觉 睡完觉 睡不成觉
理发 理了发 理过发 理个发 理完发 理不成发
洗澡 洗了澡 洗过澡 洗个澡 洗完澡 洗不成澡
打球 打了球 打过球 打个球 打完球 打不成球
吃饭 吃了饭 吃过饭 吃个饭 吃完饭 吃不成饭
事实上,这种结构能够派生出来的短语比你想像的更多,如“睡一睡觉”、“睡不睡觉”、“睡了一小时的觉”、“睡不完的觉”、“你睡你的觉去”、“觉也不睡”、“觉不好好睡”、”觉已经睡过了“等等;同时,这一类词的数量也相当多,漱口刷牙洗脸穿衣服穿鞋拿钥匙锁门开车上班写程序玩游戏下班回家做饭洗衣服上床做爱全是这一类词。因此词类标记的价值显得更大了。
又如,结果补语中间可以插入“不”、“得”变成可能补语。奇怪的是,为什么绝大多数输入法里都有“推倒”这个词,却没有“推不倒”这个词?这明明是在词库里做几个标记就能办到的事情。
推倒 推得倒 推不倒
吃完 吃得完 吃不完
学会 学得会 学不会
长高 长得高 长不高
飞起来 飞得起来 飞不起来
走进去 走得进去 走不进去
FOX新剧Fringe & 官方网站上的一个小谜题
知道4400被砍后,我郁闷了很久,这个暑假又没啥值得期待的了。随之而来的消息让我整个人立即又振奋起来:今年9月FOX将要推出一部科幻惊悚新剧Fringe。FOX的这个新剧显然是下了血本的,从它的预告片和宣传力度就看得出来。据某些看了第一集泄露版的人说,这部新剧相当精彩。追FOX的新剧必需得下很大的决心,FOX有着“剪子手”的称号,像Firefly这种不朽的经典之作居然都被咔嚓掉了。希望这次FOX千万别再乱挥剪子了。
另一个让人期待的元素是,这部新剧又是来自J.J.Abrams的。一想到J.J.Abrams就想到解谜游戏,估计只有他才会在影视剧及其官网、预告甚至周边产品里到处放些怪异的图形和密码。这次J.J.Abrams似乎又开始玩起了在Lost里早已玩过的神秘数字游戏。下面是一段Fringe的预告片,你可以多次看到在黑屏的时候会闪出一些和Fibonacci数列有关的图形。
现在,有趣的事情来了。刚才去Fringe主页上看看,发现了一个奇怪的东西:这几个按钮是什么意思?(下面有答案)