请允许我在这里不停的贴出有关密码学的东西,并且还都是载录自《应用密码学》这一本书当中的。因为首先我在密码学方面的知识也是相当的肤浅,我自己说出来的话必然没有什么威信。但是这本书的作者则很不一样,是这方面的专家。豆腐的基于密码的安全里面提到的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去不去(可能就是去当个小程序员),只好赶紧跟对方联系,又是打电话发邮件,又是准备资料的,忙了一个下午,晚上还要打电话给家里人商量……
打印 | 张贴于 2004-08-06 09:35:00 | Tag:其他

留言反馈
56位密码空间 72057594037927936需要在35小时内破解 每秒运算DES数量为
72057594037927936/35/3600=571885666967.6次
目前P4 3.0G处理器 时钟频率3.0G=3*10^10 每4条个周期完成一条机器指令 而一个运算需要几条机器指令 我们算他2条吧 一次DES起码需要100次基本运算 那么P4 3.0G机器的极限也就是 1秒钟 3*10^10/4/2/100=3750000次
按照35小时的速度 需要152502.8个并行的P4 3.0G芯片 而且忽略并行的性能损耗
10W美元 搞得定吗?
上面有人说现在PC一秒可以跑30000次DES 恩 那少了点 不如算100000次吧 好算点
那么 分析密码空间需要 2^56/100000=720575940379秒
7205759403792793/3600=200159983.4小时
2001599834386.8/24=8339999.3天
83399993099.4/365=22849.3年
就算在现在的情况下 不采用大机群并行技术 采取个人PC盲目的暴力穷居56位DES 依旧是不可能的!!!
记住 一切要计算说话阿
使用快速DES算法可以把破解速度再提高100倍,大概85秒(文中显然没有使用快速DES算法,否则即使在95年也不会破解的这么慢)(每秒运算3000,000次DES算法)
这个项目的加密需求比较特殊,明文是14位数字,希望经过加密后产生相同长度的密文(也是14位),而密钥的强度在满足上述条件的情况下越强越好。
只所以要要求密文的长度等于明文,是因为密文本身将通过二维条码技术进行图形化,然后进行印刷,这就要求密文的长度不能太长,否则会导致二维条码的图形过大。
此外,密文的表现形式最好要是数字形式的,这样可以方便用户将密文通过电话机按键上传。
我的问题是:请问哪种对称加密算法可以满足这样的需求?
E-MAIL:zhang_haifeng9@163.com
其实我也不知道有没有记错,我记得好像”熵“这个概念是信息学诞生的时候产生的,后来被借用到很多领域。其本意我认为实际上就是离一个特定的状态的距离。由于根据概率,处于某一个状态的概率总是非常小的,相对于所有可能的状态来说,所以状态一旦发生变化,通常都会离原来的状态越来越远,恢复到原始状态的概率虽然不是零,但是却非常非常的小,所以熵从总体上来说总是不断增加的。
用在压缩里面,就专门表示多余的信息量,压缩实际上就是一个通过消除多余信息的熵减过程。当然,还有好多的熵减过程,比如加密就是通过将信息变化成另外一种形式,但是长度不变的情况下的熵减过程。
呵呵,我这里可是空口无凭,不可信不可信。不要给我扔砖头哦!
1、可能这个加密算法本身就会通过一些不等长替换造成信息量增加
2、有可能里面塞进了一些校验码
3、有可能里面塞进了一些垃圾数据(随机的)
而压缩则是将信息的熵给挤掉,恰好根加密是一个相反的过程。即使某个加密算法不会让信息量增加,但是却一定会让信息本身看起来更像一个随机数序列。而我们知道随机数序列里面的熵是很低的,如果你对一个随机数序列进行压缩,几乎就不会压缩掉多少空间,熵值低就是根本原因。如果一个熵值变低了,但是实际上信息量没有变化,那代表这相当于是一个压缩的逆过程。
苍蝇,老实说我对加密不是很熟,我的概念还停留在加密等于压缩这个层次上。
我用DES的话,密钥都是一次性使用的