九月九日(外一篇)

历史上的今天:

1976.9.9-毛泽东逝世。

同日,我的一同学出生。

1999.9.9-结婚登记处人满为患,只是不知道他们现在的生活可好?


明天是教师节,自1985年第一个910教师节到现在,刚好是第二十个。虽然我经常说中国教育的不是,不过从厚道的角度出发,相当大一部分老师都是不错的,只是他们和学生们一样,也是体制的牺牲品。

感谢老师们!


外篇:三谈MD5的被破解

其实我们更应该从积极的角度来看待这个事件。

大家都学过马哲,矛盾从来都是在对立中发展的,并且将呈现出螺旋上升的态势。比如Shamir等人攻破了MH的背包公钥,但他也和别人一起提出了更好的RSA公钥。比如DES开始不安全以后,更多更强的加密手段也一一涌现。

所以说,王小云等人发现了当前所用的HASH算法存在的问题,同时也必将帮助未来的新的HASH算法设计者考虑到这方面的问题,使得新的HASH算法具有更好的安全性。

所以说,MD5被破解也未必就是坏事。

还是老子说得对:福兮祸所依,祸兮福所伏

我是如何上了Borland船的

昨天华前辈提起关于我“是如何上了Borland船的”问题,今天就写一篇说说,也算是简单记录一下这十年来作为Borland的忠实拥趸的回忆。^O^

93年刚接触电脑的时候,只能在学校的机房里,用V20(日本NEC产的一种8088兼容CPU)PC机在DOS下用GWBASIC,而且一周上一次机的机会都没有。那时别说BORLAND,连MS都不是太知道,只知道有个IBM。

94年因为已经没有计算机课了,所以不能去机房上机,还好隔壁班有几个同学自己在校外租了电脑搞打字培训(至今PF他们的商业头脑),于是就经常趁他们没有培训的时候去蹭机器用。因为流动性大,所以经常是揣着一迭软盘(还是那种老式的五寸盘)的。那时刚开始用C,当时绝大部分的C语言书都是以Turbo C 2.0为例子的,而用两张盘就能拷下的TC2自然成了我的最佳选择。从此开始上了Borland的船,只是当年也并没有特别在意。

到了95年,终于有了自己的电脑,虽然只是一台286/16/1M,不过却装了一堆的开发工具。因为机器配置差,所以这时开始比较经常地用起了Turbo Pascal 6.0,因为它的IDE比TC2好多了,速度又快,还能OOP,特别是那个叫做Turbo Vision的Framework。说到OOP,那时我也装了Turbo C++ 1.0,大概是因为软盘的问题(那时普遍没有光驱,软盘是最主要的软件交流途径),我搞到的那个版本浮点计算有问题,所以没怎么用。因为后来有一些书开始以MSC(Microsoft C)为例介绍一些DOS开发技术,所以我也装过MSC,不过用得实在太难受了,特别是它的调试功能,好像是一个叫CodeView的工具,跟Borland的Turbo Debugger比起来,简直就是“保10洁”和“保时捷”的差别。

Turbo Pascal 6.0和Turbo Debugger是我开始注意Borland的起点。

又过了一年,我装了一个Windows 3.1加Borland C++ 2.0开始做SDK开发,那是真是痛苦,要先在DOS下写好程序,然后编译,然后退出IDE,启动Windows GUI,再试着运行一下程序看看。

在忍受了一年之后换了机器,486DX/66/4M,终于可以在Windows环境下用Borland C++ 3.1 & Application Framework了,一个字:爽。BC31提供的在Windows下的IDE和调试环境,加上OWL库和BIDS(各种数据结构的类库,当然现在有STL,它早就没用了)都让我彻底上了Borland的船。

98年从乡下出来混以后,才发现自己多么落伍,因为不但是Borland C++已经出到5.02终结版,而且Windows开发也早就到32位环境下,VC一统天下了。到人才市场一看,周围人不是用DELPHI就是用VB,俺用一C++都不好意思跟人打招呼。-_-|||

只好再次动用俺的蹭机大法,买了本书在别人那蹭了一个星期的电脑,速成了一下DELPHI,总算是找到个饭碗了。

之所以会在DELPHI和VB之中选择DELPHI,除了DELPHI是Borland的产品以外,还因为俺对PASCAL的印象远比对BASIC要好,也更熟悉一些。而也是DELPHI让我没有在这一次从Borland的船上下来。

接下来的几年里,基本上都是在靠DELPHI混饭吃,越混就越不会想下来了。^O^

其间也有一次重新干起C++,虽然那个公司里别人都是用VC,还好开发的程序几乎都是用SDK和标准C++,所以我用BCB也没有什么冲突。

还有一段时间用汇编,那我也是用TASM+Turbo Debugger的。

至于华前辈说的“老板要求”这种情况我好像还没碰到过,应该主要还是开发人员自己的要求,这一点大多数老板还是都能了解的,当然应该是由用工具的人来决定选择什么工具嘛。

虽然Borland也曾经出过不少很糟糕的产品,比如自BC31以后,除了BC451以外,直到BC502,基本上都是惨不忍睹的。但是先入为主的影响还是很大的,而且Borland隔一段时间还是会出一两个像样的东西,让人总是会报有一些希望。

当然现在我已经是在SAP下用ABAP了,所以那些Borland还是MS亦或是SUN/IBM的问题,已经远没有以前那么在意了。

BTW:今天是98 CIFIT开幕的日子。^O^

BTW2:cynthia生日快乐!

白露闲谈

今天是白露,8过我出来得晚了,太阳出来很久了,什么露也没看到,大概只能晚上睡觉时“梦”露了。^O^

ARI昨天说台、疆对中国而言,类似于车臣对俄罗斯。我昨天也想过这个问题,因为我昨天刚好在论坛里看到别人贴了一个关于在新疆战东突的火星文章。

以我对台湾人的了解,他们是不可能去干恐怖活动的。一则终归是几千年中国传统文化教出来的人,奉行的宗旨是“好死不如赖活着”;再则现在台湾的各方面情况都还不错,还没到车臣人那个地步。

但是东突就很难讲了,毕竟他们都是跟拉登大叔有来往的。

BTW:违反了每日一博的规矩了。-_-|||

BTW2:不知道大家昨天有没有看了央视四套的可以来证实一下,据说

“在播放俄罗斯人质危机的新闻报导时,屏幕下滚动播出这样的信息:有奖竞猜:俄罗斯人质危机中一共有多少人丧生:答案A××人;B××人;C…D…,移动发送答案至××××,联通….;”

真不敢相信还有这么无耻的运营商和这么无耻的电视台……

BTW3:上面所说的事已经证实,详情请见央视国际网站上的节目录像

再谈MD5的问题

因为我手头没有像《应用密码学》这样的介绍具体密码算法的书,只有一本卢开澄的《计算机密码学》,主要是从数学的角度介绍了几类密码算法的原理及其适用领域。不过因为密码学是基于较为高深的数学理论,比如数论、群论、有限域等,但俺的数学不行,所以具体理论也说不出个一二三四来,只能泛泛地说个五六七八。^O^

昨天就王小云攻破MD5的问题讨论下来感觉比较零散,所以今天整理一下。

首先要说的是为什么需要使用密码?因为我们通常的通信环境是不安全的。

那什么是不安全的通信环境呢?不安全至少表现在两个方面:一是通信的内容可能被窃取;二是通信的内容可能被篡改

通常的密码使用就是为这解决这两方面的问题。

而如果有方法使某种密码的作用失效,就可以说这种密码被破解了。

当然不安全还有一些其它的方面,那些问题通常除了需要密码以外,还需要用一些特别的协议,很少碰到,这里就不提了。

常用的密码有很多种类,其中最常用的是这三种:
1、对称密码
2、非对称密码
3、摘要

对称密码的特点是:加密与解密用相同的密钥,甚至可能用相同的算法。比如从最简单的异或,到常用的DES、BLOWFISH、IDEA等。它们通常的用途是这样的:

发送方将源文(M)用密钥(K)加密:E=ENC(M,K)
然后将E通过不安全网络传给接收方,接收方用相同的密钥(K)解密:M=DEC(E,K)

只要算法足够好,并且保管好密钥(K),就可以保证这种通信是安全的,因为别人即使知道了密文(E)和算法ENC/DEC,也无法知道明文(M)。

对于这种密码来说,如果有方法可以从密文(E)和算法ENC/DEC中导到密钥(K)或明文(M),则意味这种密码被破解。比如简单异或算法就可以用统计分析法简单地破解掉。但即使是现在被认为不够安全的DES算法(已经有近三十年历史了),也需要有大量的明文/密文对(2的数十次方对),并需要大量的计算时间才能求得其密钥(K)。

非对称密码是因为这样的原因:因为在对称密码中,通信双方需要约定一个共同的密钥(K),如果这个约定过程也不安全,就可能出现密钥的泄露,而对于对称算法来说,密钥一旦泄露,之后的通信过程也就不攻自破了。

通常的非对称密码就是所谓的公钥密码算法,比如现在最常用的RSA(由R. L. Rivest和A. Shamir等人基于大数的因数分解极为困难的原理而创建),或是最近更为时髦的“椭圆曲线”,因为我的数学水平太差,具体算法也说不清楚,只知道大致是这样的:

顾名思义,它所用的算法特点在于加密与解密用的密钥是不一样的。做法大致如下:

发送方自己生成一对密钥:私钥(KA)和公钥(KPA)
接收方也生成一对密钥:(KB)和(KPB)
其中(KPA)和(KPB)是公开的
发送方用算法:E=ENC(ENC(M,KA),KPB)
进行两次加密,接收方用算法:M=DEC(DEC(E,KB),KPA)
进行两次解密,即可得到原文。
而其中双方都不需要知道对方的私钥,这就避免了约定密钥导致的不安全。
非对称密码的算法本身又决定了用私钥加密的内容必须用公钥才能解,反之亦然,并且算法还保证仅知道公钥和密文无法导出私钥,由此决定了通信的安全。

当然,如果有方法可以从公钥导出私钥来,则这种算法即告被破解。但至少目前RSA还是安全的,因为从现在的数学理论上可以证明RSA的算法是一类NPC(NP完备)类问题,只要密钥足够长(RSA要求至少是10的100次方以上,实际使用时更要大得多),以现在最先进的计算机来算,其时间成本也是不可能达到的。

摘要算法则与上面两种完全不同,前面两种密码是用于防止信息被窃取,而摘要算法的目标是用于证明原文的完整性,也就是说用于防止信息被篡改。通常也被称为:HASH算法、杂凑算法、签名算法。它的特点是:从不定长的原文中产生一个固定长度(如MD5是128位)的结果,称为“签名”(S),这个签名必须对原文非常敏感,即原文即使是有少量的变化,也会导致这个签名面目全非。比如传统的CRC或是现在要说的MD5、SHA等都是这类算法。

摘要算法的用途通常是这样的:

比如用户密码验证:如Linux或一些论坛用的方法,用户设置密码时,服务端只记录这个密码的MD5,而不记录密码本身,以后验证用户身份时,只需要将用户输入的密码再次做一下MD5后,与记录的MD5作一个比较即可验证其密码的合法性。

比如发布文件的完整性验证:比如发布一个程序,为了防止别人在你的程序里插入病毒或木马,你可以在发布这个程序的同时,公开这个程序文件的MD5码,这样别人只需要在任何地方下载这个程序后做一次MD5,然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过。

一个安全的摘要算法在设计时必须满足两个要求:其一是寻找两个输入得到相同的输出值在计算上是不可行的,这就是我们通常所说的抗碰撞的;其二是找一个输入,能得到给定的输出在计算上是不可行的,即不可从结果推导出它的初始状态

反之,如果某种摘要算法不能同时满足上面两个条件,则它就是不安全的。其实主要还是前一个条件,因为从理论上很容易证明后面一个条件基本上都是可以满足的:

摘要算法对任意长的原文产生定长的签名,按照香农的信息论,当原文的长度超过一定的程度的时候,签名中就无法记录原文中的所有信息,这意味着存在着信息的丢失,所以我说理论上不可能从签名中恢复原文。

为什么说理论上呢?就是说当这种摘要算法被完全攻破时,也就是说可以从签名恢复出任意原文,注意:是任意原文,因为所有的摘要算法的特点就是存在着一个无穷大的碰撞原文的集合。而真正的原文只是其中一份。对应这个无穷大的集合来说,这就是一个无穷小,便是我曾经说过的:

可能性为零,不表示不可能。

解释得具体一点是这样:假设原文含有信息量(I),而签名的长度有限(如MD5的128位),则它的信息量只有(i),因为通常 i < I (除非原文非常短),所以可以这么说:I=i+i’。因为I没有限制,而i有限制,则 i’ 也是一个没有限制的量。当进行摘要算法后,i’ 信息就丢失了。

反过来,如果现在这种摘要算法被攻破了,可以从 i 反推回去,但因为 i’ 信息已经丢失,意味着 i + I’ (其中 I’ 为任意信息)都可能是 I (碰撞)。但 I’ 是一个无穷集合,并且 i’ 属于 I’。这说明:理论上可以从 I’ 中找到 i’ 从而恢复出原文 I ,但是可能性为零(1/∞=0)。

但要做到前面一点就不容易了。因为绝对无碰撞的算法不可能是一个摘要算法,而只能是一个无损压缩算法。它必须包含原文的所有信息,也就意味着它一但被攻破,可以唯一地恢复出原文。并且它的结果肯定是不定长的,因为它需要包含原文的所有信息,当然会根据原文的长度而变。仅这两点就决定了,它不可能是一个好的签名算法

最主要的一点是:摘要算法的用途决定了,它只要能找到碰撞就足以让它失效,并不需要找到原文

以前面的两个例子来说:

比如Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。

但后面的程序发布的例子就要难得多,因为它必须能生成特定的碰撞,即在程序中插入病毒或木马后再填充一些数据使之生成与原来相同的MD5。

不过我昨天仔细想了一下,以MD5为例,要产生特定的碰撞应该还是不太可能的,因为MD5的128位信息量已经有点大了,如果要产生特定碰撞,需要填充的数据可能非常之大,导致伪造的原文比真实的原文大得多,可能达到若干个数量级的差别,这样的伪造就已经失去意义了。

王小云的成果已经完全使Linux用的那种基于MD5的身份验证技术失效了,虽然从技术上说它被完全攻破,还为时尚早,但从法律角度上说,已经“动摇了差不多整个数字签名界的根基”(令狐语)。

BTW:毕竟不是专业干这个的,可能有些地方不对,还请大家斧正一下。^O^

不可原谅(外一篇)

北奥塞梯别斯兰市的人质事件终于悲惨收场,代价便是这数百人的伤亡。

凤凰网文《历劫后 止痛疗伤才开始》说:

人民永不会原谅(车臣的)恐怖分子,但也永不会原谅(俄国)联邦部队和普京。

世界的反恐却换来了越反越恐的结果。

据说易卜拉欣被抓起来,拉登也快了。

看样子恐怖份子们的好日子要到头了。

真的是如此吗?难道那些反恐的人就没有看到那些正是他们自己种下的恐怖种子吗?

难怪曹刿说:肉食者鄙,未能远谋。

也许肉食者未必不能远谋,也许这正是他们的目的。让全世界的人看到,这就是恐怖份子,然后便可以堂而皇之予以打击。

至于死在恐怖份子手下的几百个平民,一百多儿童,借一句阿诺的片名来说就是:Collateral Damage。


外篇:关于MD5的破解

CSDN一篇报道说中国数学家王小云等在Crypto 2004上提出一种能成功攻破MD5的算法,GIGIX王兄都在BLOG里引用了相关的报道。

MD5是一种摘要算法,所以理论上是不可能从签名取得原文。认为要从MD5的结果中取得原文才算破解,本身就是对摘要算法的误解。它通常应用于数字签名中,用于标识原文的原始性–即在签名后未作任何的修改。如果可以用不同的原文可以产生相同的签名,这也就意味着签名可能失效,就已经可以证明这种摘要算法的不安全。

RL提供的王小云的报告我看了一下,因为我不是做这方面的,所以对MD5算法本身的实现,以及文中所引用的之前别人的理论都并不了解,所以不是很明白。在这份报告中,介绍MD5破解的部分只有一页半,并未细说具体的算法,但在末尾附了两对1024位原文的碰撞例子,较之96年别人提出的512位碰撞有了很大的进步,并且计算量据说在一个小时左右。

这些都是进步,如果把这说成是吹嘘就未免有点妄自菲薄了。

王小云的发现证明了有方法可以产生碰撞,但正如GIGIX那边一位匿名兄所说,这只是非特定碰撞,而要伪造签名则必须能产生特定碰撞。所以说MD5并未被完全攻破,但也已经是一个重大的突破了。

修复98/2000双启动

一个98/2000双启动的系统,98装在C:,同时也是Primary主引导分区,2000装在F:,是扩展分区中的一个逻辑盘。

因为用PQMagic移动了98系统分区,导致双启动中无法引导98,但2000仍然可以正常引导。

分析:

首先,我们知道98的引导方式是源于DOS,即由512字节的引导扇区读入IO.SYS文件并执行,然后启动。

双启动的原理来自于2000的引导方式:由512字节的引导扇区读入ntldr,再由它去读boot.ini的配置,最后根据选择进行引导。其中,引导98的过程是这样的:

读入bootsect.dos(这就是安装2000时备份的原98引导扇区内容),然后仿照98的启动方式进行。

结论:

由于移动了98系统分区,所以原来bootsect.dos中记录的IO.SYS文件的位置已经不正确了,所以98无法引导。

处理方法:

1、手工修改bootsect.dos文件中记录的IO.SYS文件位置,但难度太大,不用。

2、设法重建bootsect.dos,麻烦,但较可行,故用此法。

具体处理:

为安全起见,一定要先备份C盘根目录下的所有文件(包括所有的隐藏、系统等文件)。

用98光盘启动(因为没有软驱,这年头这种古董完全没有存在的必要。一则因为跟U盘相比,软盘成本高,容量小,靠不住,携带不便,基本上已经没用;二则占地方;三则浪费电),选择不需要光驱方式启动,在生成的虚拟诊断盘中有SYS.COM程序,用命令:

SYS A: C:

其中A盘为光盘启动产生的启动盘映象。

重建98的引导扇区。至此98系统已经可启动,但双启动菜单没有了,无法启动2000。

下一步就是重建双启动。

因为原来的2000引导扇区被98引导扇区所替换了,所以无法通过ntldr进行引导,自然就没有双启动菜单了。

重建双启动菜单的做法就是:重新安装2000。当然不是完全安装,做法如下:

用2000光盘启动,自动开始安装过程,选择重装2000,然后安装在任一分区(最好装在原来的2000的同一分区),指定安装目录(千万小心不要覆盖原来的2000安装目录)

在重新启动时一定要眼明手快在双启动菜单中选择Windows(即进入98系统),然后修改C盘根目录下的boot.ini,将2000的引导目录改为原来的2000系统目录。

注意:如果重新安装时不是在原来的分区上,则一定要记得修改boot.ini中的partition号,如下面中的(5),否则将因为找不到ntoskrnl文件而不能启动。

multi(0)disk(0)rdisk(0)partition(5)WINNT=”Microsoft Windows 2000 Server” /fastdetect

重新启动即可进入原来的2000系统了。

最后把后来的2000安装目录删除即可。

为了这个问题从早上一起床就忙到现在,累S了,还好搞定。

表现与逻辑的分离

昨天一个同学在MSN上问我一些问题,他正在用DELPHI做一个东西,类似于QQ这样的,即对不同的IP发来的UDP包信息,用不同的窗口显示。其类图大致如下:

可以看出,这是一个很明显的表现与逻辑混合的设计:其中MainForm除了作为主窗体以外,还要负责创建ChatForm,并维护ChatForms列表,并且当收到UDP包时,还要负责将其分发到相应的ChatForm。结果只能是出现一个巨大无比的MainForm,在其中包罗万有,最后常常会造成难以维护的下场。

这是从RAD开始编程的人的通常做法,同时也是RAD工具被人垢病的一个主要方面。

所以我给他提了一个建议,如下图:

在其中插入一个中间类,用于把MainForm中创建和维护ChatForms的功能剥离出来。至于分发UDP消息的功能,暂时可以继续放在MainForm里,由TChatFormManager提供一个根据源IP查询ChatForm的方法,MainForm通过调用此方法取得相应的ChatForm,并将UDP消息交由此ChatForm处理。

其实这就是一种消除“坏味道”的重构,其做法便是所谓的“Extract Class”。

因为他这个东西我也没看到,不知道他具体要做成什么样,所以只能给一个这样的简单意见。在实际的开发中,情况应该会复杂一些,比如有可能需要把UDP的分发放到一个单独的类中处理,或者可能有不同种类的ChatForm,则需要有一个Factory Method来处理创建工作……等等。

随便说说,仅供参考。^O^

抗战胜利五十九周年

五十九年前的今天,日本鬼子签下了投降书,标志着抗战的最终胜利。

全国人民经历了八年多、东北人民更是经历了近十四年的艰苦抗争,终于坚持到了这一天。

BTW:本来早上看新闻说教育部反对教育产业化,还正高兴着呢,看了华前辈的《教育不敢产业化了》后,发现高兴得太早了。

BTW2:访问量过两万了。^O^

BTW3:在CSDN被人说了,算了,还是不说了,做人,要低调。-_-|||

忏悔ing

昨天发了两篇驳斥伪科学的东东,结果普遍反映没看明白。

俺要忏悔,是俺的错!

真正的高手,应该是把复杂的问题说得简单明白。像俺这种菜鸟就只会把简单的问题给说复杂了。

失败-_-|||

不过,无论如何,俺要是再碰上伪科学,还是要跟它没完的。^O^

BTW:看俺今天在王兄那就.net的相关问题与王兄、ARI等的讨论:《我始终不明白的事.》、《邓主席说: 不管黑猫白猫,抓耗子都是好猫 -有感于跟风学习》。

反重力-_-|||

前几天一个朋友从QQ上给我发来了这么一个贴子:《有谁知道别隆采圆盘,知道人工反重力系统

让我想起去年我回过的一个MAIL,后来还发到CSDN的水园,不过现在找不到了,只好把邮件内容和我的反驳贴在这里

网络促进了信息的交流,同时也带来了伪科学的高速传播。

回到那个贴子上,原贴引用了三篇报道,除第二篇没有出处以外,第一篇和第三篇分别来自:国际先驱导报(新浪转载)和中国科技日报。不论它的来源是否真实,如果是真的,那这两位记者以及那些编辑的水平就太差了。

照例一条条来说:

>只要以很高的电压将电能输入电容器,就会在某个方向产生一个微弱的推力

大屏幕彩电里有大量的高压电容,其承受的电压通常高达数十万伏,不过好像从来没有听说里面的电容自己飞出来过。

>把两个2英尺宽的金属盘装载在10英尺长的转轴末端,用50瓦特的电力以高达5万伏的电压冲击该装置,金属盘以每秒16转的速度旋转起来了。

从基本的电学常识可以知道,这个装置正在以1毫安的电流在消耗电力,对应的每秒做了50焦耳的功,只要金属盘够轻,有很多方法可以实现用这些能量让它转起来,没有证据可以证明这种旋转是由于子虚乌有的所谓“别费尔德-布朗效应”。

>把高压电打入该飞行器,它果真立即飘升到空中,飘升机就此诞生。

又是这个XX效应,不过照文中对这个装置的说明,完全不像是一个电容器,而且同样没有证据证明使之飘升的是所谓的XX效应提供。

至于离子风,文中所引用的所谓“正统科学家”说的也都是外行话,不足凭信。

还有那个超导的实验,这是典型的超磁浮现象,是由于产生的电磁作用力与重力相抵消而造成的,并非什么“反重力”现象。

>关于引力,牛顿力学与爱因期坦相对论是两种互为补充但并非完全协致的理论。

牛顿引力理论一样可以证明光在引力作用下弯曲,只是用爱因斯坦的广义相对论计算的结果是,弯曲角度比牛顿的方法大一倍,而后来证明爱因斯坦是对的。小爱证明了引力是时空弯曲的一种表现。

而有质量就有引力,要“反重力”(即“反地球引力”),就要设法消除物体的质量(总不能消除地球的质量吧)。按照E=mc2,质量消失后就要转化为相应的能量(简单算一下,c取约=3 * 10E8 m/s,以文中的超导例子,设物体为100克,即0.1kg,失重1%,即1g,则转为能量约相当于2500万度电),而能量必须有它的存在方式,如质量、热或运动等。总不可能如此巨大的能量就这样消失了?

结论只能是:这个贴子不过是一帮连“重力”是什么都不知道的人搞的“反重力”而已