登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

异或加密  

2008-11-13 13:31:42|  分类: 技术积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
        异或加密简单直观,是很多人喜欢采用的对称加密算法。但最好不要采用该算法,因为这种加密算法强度极低,和直接给明文没什么区别。

       《应用密码学》节录(P10-P11):

    这是一个对称算法。明文用一个关键字做异或运算以产生密文。因为用同一只取一或两次就会付出原来的值,所以加密盒解密都严格采用同一个程序。

    这种方法没有实际的保密性,它易于破译,甚至没有计算机也能破译,如果用计算机则只需花费几秒钟的时间就可破译。
    假设明文是英文,而且假设密钥长度是一个任意小的字节数,下面是他的破译方法:

    1. 用重合码计数法(counting coincidence)找出密钥长度。用密文异或相对其本身的各种字节的位移,统计那些相等的字节。如果位移是密钥长度的倍数,那么超过6%的字节将是相等的,如果不是,则至多只有0.4%的字节是相等的(这里假设用一随机密钥来加密标准ASCII文本;其他类型的明文将有不同的数值),这叫做重合指数(index of coincidence)。指出密钥长度倍数的最小位移即密钥的长度。
    2. 按此长度移动密文,并且和自身异或。这样就消除了密钥,留下明文和移动了密钥长度的明文的异或。由于英语每字节有1.3位的实际信息(参见11.1节),因此有足够的冗余度去确定位移的解密。

    尽管如此,一些软件销售商在兜售这种游戏式算法时,还声称“几乎和DES一样保密”,这使人感到震惊。NSA最终允许美国的数字蜂窝电话产业界使用这个算法(有160位的重复“密钥”)对语音保密。异或或许能防止你的小妹妹偷看你的文件,但却不能防止密码分析家在几分钟内破译它。

        可以这么认为,如果你用异或进行加解密,那么跟直接保存明文就没有什么差别。因为一旦取得了密文,并且知道使用的是异或算法,那么剩下来的保密时间就在几秒钟到几小时之内。即使一个没有什么密码学知识的人,也可能写出一个什么工具来进行破解计算。或者说你如果采取了异或加密算法,那么整个系统的安全性就根本不在你手中,那么你加上这个算法和不加上又有什么区别呢?干脆不要加算了。

        网上“异或加密”现成的破解工具多的是。

        这个论断很鲜明,印证了那句“不要自己随便去‘创造’加密算法”的古训。算法保密不是保密,密钥保密才是真谛。

 

参考:http://blog.joycode.com/sumtec/archive/2004/08/05/29658.aspx,附上原帖下比较精彩的回复:

2005/1/7 9:52 | sth

把安全依赖一个不知道什么时候会被泄漏的算法是错误的,正在使用或者设计这种以算法保密为安全基础的方法的人应当认认真真,仔仔细细的从头学习密码学,否则你做出来的东西最多只能称为toy

对于自视甚高发明算法的人,没有必要去用证明他们的算法强度,因为他们自己都无法给出严格的数学证明,这才是最关键,但是他们顶多给出猜想来证明,顶多说几个“显然““因此““不怕死得就来试试”这样幼稚的话。他们以为上厕所的时候就能随随便便的发明出算法。让我们来做个游戏:

地上散落着很多扑克牌,有的正面朝上,有的背面朝上,我现在要求你给我5张背面朝上的扑克牌。

A先来,他闭上眼睛,然后从地上捡起5张,再睁开眼睛,发现不是5张背面朝上,他重新闭上眼睛,捡起5张,再睁开眼睛…直到5张都是背面朝上为止。根据概率统计他取正确的几率是2的5次方分之一,但是即便如此,他也不能保证在32次内取对,今天很不幸A够衰,他取到44次终于取得正确了,于是他兴奋的得出结论:强度是44。

轮到B了,B比较聪明,他闭上眼睛,从地上捡起一张,再睁开眼睛,如果发现不是背面朝上,那么他就把牌翻过来,继续捡下一张,直到捡完5张,根据概率统计他最多也只需要10次就可以保证取得5张背面朝上的牌。今天B也很衰,第10次才正确,于是B得出结论:强度为10

轮到C了,C直接睁开眼睛,从地上捡起5张背面朝上的牌,1次就成功了。

做完这个游戏我们能领悟到什么?A就是那传说中的白痴,他自以为强度是5bit的,虽然B不够聪明但是他能够保证10次内取得,能够证明A的结论错误,而C更聪明。

不要随便指望你发明的强度有你设计的那样高,也许真的有这么高,但是即便如此,你都无法从数学上证明。你的128bit的算法恐怕最后连8bit都没有。目前的加密算法都是基于当前无法解决的数学难题来实现的,这样的实现是可行的,都是由理论根据的,一旦该数学难题被破解,那么理论基础也就不存在了,相应的算法就自然而然的要被淘汰。很多发明算法的人的理论基础又是什么呢?从理论到实现都是臆造,证明也是某某式猜想。这种幼稚的东西也只能用来作为toy。玩玩就行了,但是千万不要搞得太认真,害人害己。

2006/4/5 10:18 |wuxiang

我可以钻个楼主的空子。

用异或改变明文到密文的做法没有错。

关键是看密钥的长度。如果密钥的长度大于明文的长度用异或加密又何尝不可呢。

leighsword 用随机数的方法加密。看起来是不可还原的。但值得注意。他使用的随机数函数是rand()。只要种子与加密时的相同。还原时可以产生相同的随机数序列。

如果这样理解,把种子称作密钥也许更好些。

2005/4/6 16:44 | Kaperate

依赖于对算法保密的密码算法都是非常危险的算法。很多人自己写了一套算法,在自己看来好像不可逆推,但在专家手上细细分析就有很多漏洞可以破解。所以,在声称自己的算法本身有多高强度之前一定要事先经得N多专家N年的论证。切记切记。 


2012-2-25
    发现某些项目中对DESRC5等经典算法有一个非兼容的DIY实现,在跨应用、跨平台、跨语言的情况下会很纠结。在没有充分证明的情况下,我不会承认这些DIY加密算法具有更优的加密强度与时空复杂度
  评论这张
 
阅读(6884)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018