RSS 2.0 Feed
2004-08 Entries
摘要:人生就是这么奇妙,到处都是陷阱到处都是十字路口,走不了多久你就需要仔细思考做出选择,而平凡无忧的生活总是一个很小的片断。这一次我选择离开原来的地方,因为我太清闲了,感觉没有学到更多的东西。但是如何选择新的工作地点真是一件非常头痛的事情,可供我选择的有大中小三个方向,越大越保守,越小越有激情。其实反过来说就是越大越稳定有保障,越小越奔波冒风险。面对这样一个选择,我咨询了很多人的意见,真是什么样的说法都有,感觉就跟小学课本里面的《小马过河》一样,问了之后更加不知道自己该做什么样的决定了。折腾了一个礼拜,最后还是一位在国际大公司里面当“高层”的大朋友(没有到CXO那一种级别,估计低两到四级吧,具体我也不清楚)给我做出了很有用的分析,不过却没有给我答案,但是我听完以后我终于能够狠下决心下了那个其实我一直都想下的决定——跑去跟JGTM疯至少一阵子。也就是说,我要离开南京跑北京去了。说老实话,我对于这样的决定也真的没有什么信心,我只是想着我在那边也许能够学到更多我希望学到的东西,这也许已经足够了。而另外一个诱惑着我的,则是看看有没有机会参加博客堂的腐败聚会,认识一下开心、mvm等重要人物。当然更重要的还是让他们认识我,如果以后又要再次寻找发展空间的时候,希望有更多的人能够给我提供帮助(当然我会很感激的啦)。嗬嗬,先不说这些了,免得JGTM说我没有诚意。其实担心还是一只存在的,因为我是一个怀疑论者,如果看不到事实就算说得多好听,我还是会怀疑的。具体一点讲,就是没有看到真正的产品被大量卖出去了、盈利了,我是不会认项目是成功的。说得更难听的就是,我从来不会认为一个产品将来一定会成功,对我来说罗列多少预测数据都没有意义。就这样一个个性,其实我会整天担心创业的项目会不会最终失败,会不会远没有我们想象的那样好。(我就见到过很多容易盲目乐观和冲动的案例,结果都不是很理想。)其实我加入JGTM所能够做到的也就是尽力做好自己的工作,努力的学习,至于产品是否成功,最终还是市场说了算,我也无能为力。具体什么时候动身,还需要看我在南京的各项准备工作是否顺利,要处理的个人事务实在是不少,很令我头痛。但是月底之前一定是要出发了,因为房子的租期要到了。因此在这里跟cnblogs的 hBifTs 说一声抱歉,恐怕我们是无缘在南京见面了,如果您有空的话可以到北京来找我,呵呵。说到去北京,我想可能要跟曾经在我现在这个公司的,但是现在已经到了北京chinablog的一位同事碰头了,至少他也要回来南京处理一些东西,也许我们会一块出发去北京吧。在北京还可以碰到我上面提到的那位大朋友,这是一件让我感到幸福的事情,因为上次他给我提建议的时候,我就感觉到我学到了很多人生和社会方面的知识,觉得他的阅历确实非常丰富。到了北京我一定会经常找机会跟他一块喝茶,讨教一些人生的经验。(呵呵,跟高级的ID交流,打经验值,飙得狂快哦!)不过人家是在飞机上的时间多过我睡觉的时间,有没有机会就另当别论了。最后,首先要感谢JGTM给我提供了这么一次机会,也提供给我很好的工作设备。其次要感谢这次邀请我的几家公司,虽然我的最终选择并不是你们,有一些甚至连面试都cancel掉了,虽然你们也许不会有人看到我的Post(看到的给我留个言吧,比如郭先生孙先生,好让我知道我们还是 keep in touch 的)。我希望仍然能够和你们保持良好的关系,也希望以后能够有机会合作愉快。另外还要感谢所有我请教过意见的朋友们,你们的建议对我非常重要,我想这次我能够做出很全面的分析,离不开你们的帮助,比如Henry, Montaque, dudu等,人太多了不一一数出来了。此外我也对这么多天整天烦着你们表示歉意!这几天我也许会忙,也许会心情不好,总之如果从现在开始三十天内没有更新自己的Blog,那也是很正常的。不过我想我这个文笔糟糕,水平麻麻的ID,也不会有人跑来给我催稿的。万一我真的有几个“粉丝”想看我的Post而不得,还请多担待,多等等,谢啦!...[阅读全文]

posted @ | Feedback (28) | Filed Under [ 其他 ]

摘要:简单异或实际上是非常的危险的,这个知识是在书上看到的。最近跟某位朋友进行了这方面的争论,因此我突然对这个问题非常感兴趣。其实之前我也没有任何密码学分析的经验,更没有写过相关的程序。今天也就花了一天的时间,就把整个破解程序给写出来了。这个是那位朋友提出来的算法的核心: char g_szSeed[5/**//*26*/] = { 'a', 'b', 'c' ,'1', '2', }; BOOL Compress(LPCSTR lpstrSrc, LPSTR lpstrDen, unsigned long lLen){ _ASSERT(lLen > 0); size_t nSeedCount = sizeof ( g_szSeed ) / sizeof(char); for(unsigned long i = 0 ; i < lLen; ++i ){ char chCurSeed = g_szSeed[i % nSeedCount]; if(*(lpstrSrc + i)) *(lpstrDen + i) = (chCurSeed ^ *(lpstrSrc + i)); else *(lpstrDen + i) = *(lpstrSrc + i); } return TRUE; } 他写的是C++代码,我对这个进行了一定的转化,变成了C#的形式。然后对这个加密算法加密出来的密文进行攻击,攻击的时候完全不知道密钥的长度及内容,也不涉及加密算法代码本身(当然会涉及到该加密算法的相关知识)。因此破解过程还是相当的公正的。想知道我怎么进行破解的吗?点击这里可以下载源程序(当然也包括破解程序)。运行过我的程序,你应该会发现原来破解“简单异或”加密算法是一件多么容易的事情了:一天的编码时间(从完全没有这方面经验开始),加上几秒钟都不到的运行时间,一切就搞定了。...[阅读全文]

posted @ | Feedback (11) | Filed Under [ .NET 技术内幕 其他 ]

摘要:请允许我在这里不停的贴出有关密码学的东西,并且还都是载录自《应用密码学》这一本书当中的。因为首先我在密码学方面的知识也是相当的肤浅,我自己说出来的话必然没有什么威信。但是这本书的作者则很不一样,是这方面的专家。豆腐的基于密码的安全里面提到的BlowFish加密算法就是这本书的作者Bruce Schneier所设计的。能够设计一个比较出名的,也比较安全的加密算法的人,他的话应该足够权威了。BlowFish在这本书的P237有介绍,并在本书的最后面还有源代码。其次,这本书写得非常的好,影响也非常的大,甚至曾经遭受到NSA(也就是美国的国家安全局)的阻挠,经过很大的努力才最终发行的。这本书里面的所有数据都不是随便说说,可以说是引经据典,一共引用了1653本书或者论文等。即使你不相信Bruce Schneier的话,那也应该相信他所引用的资料,这些资料能够被引用,那我想大多数应该是一些著作或者在权威杂志发表的。 我之所以在如此短的时间之内贴出这么多的资料,主要是因为看到leighsword在我的第一篇关于密码的Post里面的回复,坚持使用异或,因此发了第二个Post。同样的原因,看到leighsword在第二篇文章里面声称56位的密钥是安全可靠的,因此不得不贴出第三篇文章。我原本想把下面这些话直接在第二个Post里面回复,但是我想可能有很多人同样不知道密钥长度的安全性问题,贴出来也算是共享知识。在这里我无意针对任何人,因为我也曾经有过同样的误解,我也曾经使用过类似异或的方法来进行数据加密。但是后来我发现错了,并且我不希望同样的错误发生在其他人的身上,以免造成损失。 下面这一端是摘录自《应用密码学》这本书(第二版)P106页下面的: 最近Micheal Wiener决定涉及一台穷举攻击机器[1597、1598]。(注:引用其他文章的内容,看来应该是真实的,或者说至少是很严肃的研究结论,而不是什么拍拍脑袋就想出来的事情)(这台机器是位攻击DES设计的,但对任何算法都适用。)他设计了专门的芯片、主板、支架。并估算了其价格。他发现只要给丁一百万美元就能够制造出一台这样的机器是其在平均3.5小时(最多不超过7小时)里能破译56-位密钥的DES算法。他还发现机器的价格和破译速度之比是成线性的,表7-1列出了各种密钥长度的对应数据。记住摩尔定律:大约每经18个月计算机的计算能力就会翻一番。这意味着每5年价格就会下降到原来的百分之十,所以在1995年所需要的一百万美元到了2000年就只用花十万美元。流水线计算机能够做得更好[724]。   花费的金钱(美元) 密钥长度 40 56 64 80 112 128 10万 2秒 35小时 1年 70000年 1014年 1019年 100万 0.2秒 3.5小时 37天 7000年 1013年 1018年 1000万 0.02秒 21分钟 4天 700年 1012年 1017年 1亿 2毫秒 2分钟 9小时 70年 1011年 1016年 10亿 0.2毫秒 13秒 1小时 7年 1010年 1015年 100亿 0.02毫秒 1秒 5.4分钟 245天 109年 1014年 1000亿 2微秒 0.1秒 32秒 24天 108年 1013年 1万亿 0.2微秒 0.01秒 3秒 2.4天 107年 1012年 10万亿 0.02微秒 1毫秒 0.3秒 6小时 106年 1011年 对一个56-位密钥,穷举攻击所需金额对很多大公司和一些犯罪组织来说还是可以承受的,对于64-位密钥,则只有一些发达国家的军事预算才能够承受。而破译80-位密钥现在仍然不可行,但是如果按目前的形势继续发展下去的话,这种情况将会在30年内发生改变。当然,估计未来35年计算机的计算能力是很可笑的,一些科幻县说理出现的技术突破可能会觉得上述预测很可笑。相反,目前一些位置的物理限制又使人们产生不切实际的乐观。在密码学中悲观一点是很明智的。用80-位密钥的加密算法是一种目光非常短浅的行为,还是坚持至少用112-位的密钥吧。如果攻击者想要不择手段地破译一个密钥,他们必须要做的全部事情就是花钱。所以,估计一下密钥的最小“价值”似乎是明智的:在试图破译一个有经济价值的密钥之前,要确信他到底有多大价值呢?举一个极端的例子,如果一个加密的消息仅值1.39美元,那么用一台价值1000万美元的破译机来寻找它的密钥在经济上就毫无意义了,另一方面,如果明文消息值1亿美元,那么早已太破译击破一次信息是值得的。此外,有些消息的价值会随时间迅速减少。 其实我也并不是所有的东西都记得,只是有一些很经典的话我是记得非常清楚的,就像上面的那一段话。这段话里面包含了非常有价值的信息在里面:1、我们应该怎样选择密钥的长度?上面的那个表充分说明了解答这个问题的关键。这个表的数据是1995年的数据,现在已经过去了将近10年了,也就是说上面的金钱花费已经严重缩水到原数值的1%,第一行的数据实际上应该是一台造价为1000美元的机器,约合人民币8000元。我想如果用普通的8000元人民币的PC机,假设其计算性能也许只有文中所述的破译机的千分之一,那么35000小时也就是1458天约合4年不到,也绝对不是LeighSword所说的1万年都解不出来。实际上的数字应该比这个悲观不少,我们可以看看2002年11月8日的新闻,里面说到破解109位密码竟要劳驾1万台PC花费549天。看起来好像挺悲观的但是实际上你会发现,原来单台PC破解109位密码的能力也就需要549万天,约合15041年多一点。对照上表,可以发现这个数值比目前一台8000元人民币的PC暴力破解80位DES的时间还要短得多!当然,这里面的破解方法并不一定是纯暴力破解,而且对方所使用的是什么算法也不清楚。但是由于基本上可以猜测这是一个基于暴力破解的破解方法,而暴力破解对于到底是什么算法敏感性比较低,所以可以从一个侧面反映上表的估计还是八九不离十的。也就是说在今天,对于一个56位的密码用一台普通的8000元人民币的PC,暴力破解的时间应该在几小时到几个月之间,至于是多少我也不清楚,但是我想这个估计还是比较合理的。现在我们已经知道了,如果你需要对你的秘密进行保密的话,那最好还是相信上表的内容,甚至应该乘以一定的安全系数。上面那一段话也提到了,选择多长的密钥取决于你的信息的价值,没有人会为了一个可能只有1美元左右价值的信息去花费超过1美元来进行破解的,因为这样明显不值得。但是大家也不要误解了上面的那一段话,因为一台价值1000万美元的机器,其每次解密的成本并不是1000万美元。如果算上运行费用,假设保费之前能够进行10万次解密,那么每一次解密的成本也许就是300元。如果更加精确一点的计算应该是按照时间来衡量的,按照05年计算成本来计算(相当于95年10亿美元的机器)解密56位密钥的密文,如果这台电脑能够连续用一年的时间,那么一共可以解大约242.6万次,那么每次的成本也就是15美元左右。假如一个网站用56位的密码保存有关如何获取一台笔记本奖品的信息,那么显然我愿意去花这15美元,甚至多花十倍的价钱都是物超所值的。照这么说,我应该如何决定密钥的长度呢?密钥的长度应该是越大越好!如果你的软硬件允许,就应该使用128位的密钥。实际上加密的成本是低之又低,速度是快之又快,我相信现在随便哪个人的电脑都能够承受128位密钥的对称加密算法的加/解密运算,并且我认为你几乎就感觉不到56位和128位在无论是速度还是成本上到底有什么差别。那么你为什么不用128位密钥而用56位呢?解释就是你没有意识到上面我说的这段话,或者是你懒,或者是这个东西其实根本就不值得加密,明文密文都无所谓,你只想不让你妹妹看到你的情书面子上挂不住而已。希望看到我这一段话之后,都会有一个正确的认识。2、如何选择加密算法?实际上我不知道大家意识到没有?我在上一个Post里面已经摘录了一段话,其大意就是:算法是否安全必须通过公开的检验才能够断定,如果你的安全性是根据别人不知道你的算法这个假设的话,绝大多数都是一个非常危险的假设。RC4就犯了这样的错误,如果说一个专业设计密码的人都会在这个问题上面栽跟头,您还是不要盲目相信自己的实力了。目前来说,有好多算法是非常安全的,当然可能代码来说是比较复杂一点,但是有很多免费的库可以提供这些能力(部分算法不是免费的),而很多的开发环境比如.NET Framework甚至就直接提供各种很好的加密算法。就算如果不能够使用这些既有的资源,必须自己编写代码或者使用别人的代码,那也千万不要选择异或这样的算法,非常地不安全。这里需要稍微详细说一下各种的密码学分析:a. 暴力破解。这是最为原始的分析方法,可以说是性能上非常糟糕一种方法,大部分的分析方法都有机会比这个方法更加有效,但是也有很多分析方法在特定的条件下甚至能够比这个方法更糟糕。但是从另外一个方面说,这个分析方法跟加密算法本身的强度的敏感性十分的低。如果一个加密算法通过暴力破解需要时间T,那么同等密钥长度的另外一个算法,其破解时间也应该跟T相差不远,至少不是十万八千里的。上面那个表的数据就是暴力破解的数据,而一个好的加密算法应该使之能够通过暴力破解来进行分析的。但是这句话千万不要反过来理解,认为任何加密算法的安全强度都能够对照上表来估计,那就大错特错了,因为还有很多的密码学分析方法,而大部分其他密码学分析方法所需要的时间在特定条件下都会远远小于暴力破解所需要的时间。之所以说异或是很糟糕的方法,是因为他能够通过其他分析方法来达到用远远小于T的时间来破解的。b.逆向工程法。这也是一种大家都能够想到的方法,意思就是我有你的算法的源代码,据此分析出解密的函数D或者替代函数D'。需要说明的是,不一定能够直接得出一个结论,也许是通过分析源代码得出这个算法的弱点,或者密钥信息泄露的途径。如果拥有源代码,并且分析出密钥信息泄露的途径,那么很明显可以通过选择明文攻击的方式来获得完整的密钥。比如密钥的某一位或者某几位会反映在密文的某一位或者某几位上面,那么可以通过设置一组特定的明文来获得密钥的一部分,多组明文就能够恢复密钥。如果你寄希望于直接获得解密过程,那么这个方法也不见得是一种好的方法,肯能会使一件很困难的事情。尤其对于那些非常健壮的算法来说,例如DES等等,这些算法完全就是公开的,目前根本就没有能够直接获得解密过程的方法,甚至连非常有效的选择明文攻击都没有。好的加密算法显然也应该能够经受这种分析。c.其他各类统计学方法。例如前面提到的重合码计数法,以及没有提到过的线性攻击和差分攻击。实际上这些都是基于有选择性的明文或者密文攻击的,攻击的方法就是统计这些数据的特征,试图找出密钥的长度、密钥特征等信息,一次缩小穷举搜索的范围,甚至直接组合出整个密钥。比如说异或算法,其实上一个Post已经说到了整个的破解过程,我在这里再稍微解释一下:1、首先由于密钥的长度是有限的,如果攻击时所使用的位移长度和密钥长度一致,则可能泄露一定的信息。也许这些信息不完整,对于知道整个密钥的信息没有什么帮助,但是却可以知道密钥的长度。2、如果已经知道密钥的长度了,那么把密文和位移了密钥长度的密文相异或,就能够消除密钥,得到明文间的异或。这个时候由于已经没有密钥存在,因此就可能分析出整个的明文信息,并据此得到密钥。实际上我看到LeighSword的另一个回复,似乎提到了使用随机数。但是实际上如果不是用于密钥交换,那么就必然不能够使用真正的随机数,而只能够通过随机数发生器来产生,而这个时候算法的强度则还需要看这个随机数发生器的强度。之所以不能够用真正的随机数,是因为需要重复这个过程进行验证,无论是通过解密来验证,还是通过再次加密比较密文来验证,都需要这个随机数严格一致。这个时候实际上已经是加密算法的一部分了,实际上绝大多数的加密算法里面都用到了随机数发生器以及异或运算。也许我说得不清楚,上面提到的不安全的是简单异或算法。如果LeighSword用到了随机数发生器,那么就不能够说是简单异或算法了。一般说“异或加密”意思就是仅仅利用了异或操作,或者简单的叠加上轮换或者替换方法,并且只有一轮操作。如果加上了随机数发生器,那么就不能够随便地称之为“异或加密”算法了。 一般比较成熟的加密算法都是采用下述操作进行组合:1、异或2、循环位移3、S-盒(类似的东西)4、交换(某一位或者几位)5、多项式计算(比较少见)以上述的操作组合成为一个标准的加/解密“轮”,然后将这个“轮”进行多次串联来产生最终输出,所以一般我们都会看到很多地方会说DES最好至少采用16轮以上的加密,就是这个意思。轮数越多,就越有可能抵抗线性攻击和差分攻击(但是也要视具体的算法而定)。如果仅仅只有一轮的算法,多数是逃不过差分攻击的,甚至连线性攻击都抵抗不了。那么是否抵抗线性分析和差分分析是否那么重要呢?我们来看一下《应用密码学》P206下面的一段话: ……。Susan Langford和Hellman对一个8-轮DES进行攻击,选择明文数为512时,会付出10密钥位的可能性为80%;选择明文数为768时,会付出10密钥位的可能性为95%。在上述攻击进行后,再采用穷举搜索得到剩余的密钥空间(246可能密钥)。……。然而,对更多轮数的DES,这种扩展似乎也不易实现。(注:这里所说的DES的密钥长度是56位) 换句话说,如果你的加密算法不能够抵抗一些密码学的分析,那么实际上你的“有效”密钥长度并没有你所设置的那么长。如果我们对照上表,那么也许你就会发现,也许原来你以为你的数据经过加密之后其有效保密时间至少是35小时,但是实际上却只有几十秒钟的有效时间。当然,上表的数据应该是一个标准的DES,有16轮的加密过程,而上面所说的攻击是针对8轮DES而言的,对于16轮的DES,也许效果就不是那么明显了。但是如果你的加密算法只有1轮,那么问题肯定会非常的严重!设计一个加密算法远比我们想象的要复杂和危险,就如书中所说的那样,宣称它是不安全的比证明他是安全的要容易得多。 关于某个特定的加密算法的争论,我并不想争论下去。在这里我也只是尽我所能,把我所看到的一些书上面的文字共享出来,希望都能够对密码学有稍微深入一点的了解。 这篇文章本来应该昨天下午就Post出来,结果上海突然有一个完全不认识的人打电话过来问我上海HP去不去(可能就是去当个小程序员),只好赶紧跟对方联系,又是打电话发邮件,又是准备资料的,忙了一个下午,晚上还要打电话给家里人商量……...[阅读全文]

posted @ | Feedback (32) | Filed Under [ 其他 ]

摘要:还是从《应用密码学当》中节录下来的一段话(P10-P11): 这是一个对称算法。明文用一个关键字做异或运算以产生密文。因为用同一只取一或两次就会付出原来的值,所以加密盒解密都严格采用同一个程序。这种方法没有实际的保密性,它易于破译,甚至没有计算机也能破译,如果用计算机则只需花费几秒钟的时间就可破译。假设明文是英文,而且假设密钥长度是一个任意小的字节数,下面是他的破译方法:1、用重合码计数法(counting coincidence)找出密钥长度。用密文异或相对其本身的各种字节的位移,统计那些相等的字节。如果位移是密钥长度的倍数,那么超过6%的字节将是相等的,如果不是,则至多只有0.4%的字节是相等的(这里假设用一随机密钥来加密标准ASCII文本;其他类型的明文将有不同的数值),这叫做重合指数(index of coincidence)。指出密钥长度倍数的最小位移即密钥的长度。2、按此长度移动密文,并且和自身异或。这样就消除了密钥,留下明文和移动了密钥长度的明文的异或。由于英语每字节有1.3位的实际信息(参见11.1节),因此有足够的冗余度去确定位移的解密。尽管如此,一些软件销售商在兜售这种游戏式算法时,还声称“几乎和DES一样保密”,这使人感到震惊。NSA最终允许美国的数字蜂窝电话产业界使用这个算法(有160位的重复“密钥”)对语音保密。异或或许能防止你的小妹妹偷看你的文件,但却不能防止密码分析家在几分钟内破译它。 可以这么认为,如果你用异或进行加解密,那么跟直接保存明文就没有什么差别。因为一旦取得了密文,并且知道使用的是异或算法,那么剩下来的保密时间就在几秒钟到几小时之内。即使一个没有什么密码学知识的人,也可能写出一个什么工具来进行破解计算。或者说你如果采取了异或加密算法,那么整个系统的安全性就根本不在你手中,那么你加上这个算法和不加上又有什么区别呢?干脆不要加算了。...[阅读全文]

posted @ | Feedback (44) | Filed Under [ 其他 ]

摘要:前一阵子看到豆腐的基于密码的安全,很多人都在里面进行了讨论,这让我想起来那本我一直很推崇的书《应用密码学》。我记得在以前其它的Blog上面也提到过,甚至可能写了几乎完全相同的内容。不过在博客堂我没有写过类似的内容,在这里再写一遍吧。 我们平常经常都会涉及到加密、解密、签名以及验证等问题,这些都跟密码有关系。密码是一种学问,里面包含了很多的东西。如果我们看到上面那四个问题,我们固然会想到加密算法,比如RSA,DES,BlowFish。所谓加密算法无非就是怎样用一套称为密钥(包含非对称算法的公钥)的东西,将某些信息颠来倒去的过程。这个过程看似神秘,但是实际上这个并不是密码学里面发挥关键作用的东西。当然,算法不好,那么可能很容易通过一些方法进行破解,算法好则相对困难。那么什么是更关键的呢?下面这一大段话则是摘录自《应用密码学》一书第4页:   常用的密码分析共计有四类,当然,每一类都假设密码分析者知道所用的加密算法的全部知识: 1、唯密文攻击(ciphertext-only attack)。密码分析者有一些消息密文,这些消息都用同一加密算法加密。密码分析者的任务是恢复尽可能多的明文,或者最好是能推算出加密消息的密钥来,以便可采用相同的密钥解算出其它被加密的消息。……2、已知密文攻击(known-plaintext attack)。密码分析者不仅可以得到一些消息的密文,而且也知道这些消息的明文。分析者的任务就是用加密信息推出用来加密的密钥或者到处一个算法,此算法可以对用同一密钥加密的任何新的消息进行解密。……3、选择明文攻击(chosen-plaintext attack)。分析者不仅可得到一些消息的密文和相应的明文,而且他们也可选择被加密的明文。这闭一只明文攻击更有效。因为密码分析者能选择特定的明文块去加密,那这些块可能产生更多关于密钥的信息,分析着的任务是推出用来加密消息的密钥或者到处一个算法,此算法可以推用同一密钥加密的任何新的消息进行解密。……4、自适应选择明文攻击(adaptive-chosen-plaintext attack)。这是选择明文攻击的特殊情况。密码分析者不仅能选择被加密的密文,而且也能给予以前加密的结果修正这个选择。在选取较小的明文块,然后再基于第一块的结果选择另一明文块,以此类推。…… 另外还有至少三类其它的密码分析攻击。 5、选择密文攻击(chosen-ciphertext attack)。密码分析者能选择不同的被加密的密文,并可得到对应的解密的明文,例如密码分析者春去一个防篡改的自动解密盒,密码分析者的任务是推出密钥。……。这种攻击主要用于公开密钥算法,……。选择密文攻击有时也可有效的用于对称算法(有时选择明文攻击和选择密文攻击一起称作选择文本攻击(chosen-text attack))。(注:稍微解释一下,这个攻击的前提是分析者能够获得一个密封的“解密盒”,也就是一个已经固化的、专门用于对用某一个特定密钥加密过的密文进行解密的硬件。攻击的方法就是随机产生一个“伪密文”(不一定是合法的),让解密盒进行解密,从所得到的明文和密文进行比较,得到关于密钥或者算法的相关信息。这种攻击实际上和选择明文攻击相类似(就是它的逆过程),只是明文变成密文肯定能够成功,但是逆过程则不一定成功。同时,一般加密算法的设计对于从加密后的密文里面泄露密钥信息是比较注意的,但是从明文里面泄露消息则考虑得相对较少。此外,如果是非对称加密算法,两个破解方向由于密钥长度的不同,会引起破解难度的巨大差别。因此选择密文攻击很可能得到比选择明文攻击更多的信息。)6、选择密钥攻击(chosen-key attack)。这种攻击并不表示密码分析者能够选择密钥,它只表示密码分析者具有不同密钥之间的关系的有关知识。这种方法有点奇特和晦涩,不是很实际,……。7、软磨硬泡攻击(Rubber-hose cryptananlysis)。密码分析者威胁、勒索,或者折磨某人,直到它给出密钥位置。行贿有时称为购买密钥攻击(purchase-key attack)。这些是非常有效的攻击,并且经常是破译算法的最好途径。 已知明文攻击和选择明文攻击比你想象的更常见。密码分析者得到加密的明文消息或者贿赂某人去加密锁选择的消息,这种事情时有所闻。如果你给某大使一则消息,你可能会发现该消息已被加密,并送回他的国家去研究。……。已知明文攻击(甚至选择明文攻击)在第二次世界大战中已被成功地用来破译德国和日本的密码。……   看到这里大家也许就会发现了,这里根本就没有讨论到具体某个加密算法。并且可以看到,越后面的攻击对于安全的危害性越大,而跟具体加密算法的强度的关系就越小。换句话说,整个系统的信息安全程度在很大程度上取决于与具体加密算法算法无关的部分。那么这些部分是什么呢?是协议。 协议是一套过程——比如保管密钥和密文的方法,或者交换密文信息或者密钥的步骤等等。协议的内容不一定全部都是和算法或者计算机内部相关的内容,有时候也包含了自然人如何能够接近甚至得到操作的机会或者其它的一些现实当中的事情。如果协议设计得不好的话,将会比较容易受到2-7的攻击,这个时候就不一定取决于加密算法的强度了。就像豆腐的基于密码的安全里面提到的攻击,可以认为是3+7的一种混合攻击:首先通过7得到了数据库的访问和修改权限,其次通过3得到了一个已知明文的合法密文,然后修改数据库使得超级用户的密码是自己设定的密码。这里的选择明文攻击根本就不关心具体的密钥是什么,只要得到合法的密文就足够了。当然,如果作者有足够的知识和时间,完全可以破解出这个密钥出来,日后可以随时进行直接的攻击。其实在这本书里面有很多很有趣的例子,说明了协议在密码学里面是多么重要,如果有时间我在节选一下这本书里面的例子,给大家参考参考。 最后我再节选出该书当中对我有“开窍”作用的那么一段话,在第5页下面: 不要忘记Kerckhoffs的假设:如果你的信的密码系统的强度依赖于攻击这不知道算法的内部机理,你注定会失败。如果你相信保持算法的内部秘密避让研究团体公开分析它更能改进密码系统的安全性,那你就错了。如果你认为别人不能返回便溺的代码和你想设计你的算法,那你就太天真了(1994年RC4算法就发生了这种情况——参见17.1节)。最好的算法是那些已经公开的,并经过世界上最好的密码分析家们多年的攻击,但还是不能破译的算法(国家安全局对外保持他们算法的秘密,但他们有世界上最好的密码分析家在内部工作,你却没有。另外,他们互相讨论算法,通过执着的审查已发现工作中的弱点)。 也就是说,我们整个系统的强度应该是假设除了未加密的密钥之外,完全暴露在外界当中的情况下的强度。比如说豆腐的基于密码的安全里面提到用用户名作为salt,实际上对于加强整个系统强度的帮助可能是有限的:1、假如取得数据库的权限相当于取得系统的执行权限甚至调试权限,那么完全有可能通过类似调试的手段手动调用系统的“加密”部分的函数,得到密文结果。2、或者如果我们得不到这个执行的权限,也可以通过选择明文攻击的方法来进行的破解,就是多注册几个不同的用户,密码一样,找出salt对于最终结果作用的关系。 当然,上面这个想法只是随便想想的,也许实际上也没有更好的办法。我的意思是考虑安全问题的时候如果焦点在算法安全性,或者系统的保密能力上面,那就错了。...[阅读全文]

posted @ | Feedback (7) | Filed Under [ 其他 ]

摘要:1.   The only references that an interface provides:  a.  are declarations of functions only   b.  are declarations of fields only   c.  are declarations of methods only   2.   All interface methods are …….. by definition.  a.  Private   b.  Public   c.  Internal   d.  Protected   我没有答案,各抒己见吧。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 其他 ]