由于之前已经发过两篇DES算法的原理,一篇中文和一篇英文的,在此就不再过多重复原理,本人建议学习DES时,以英文版为主,原因有两点:第一,中文版中讲 解密时右移得密钥,我觉得这个没必要,相反,会增加处理的麻烦性,因为解密时根本无需更改加密时的同一组16子密钥,只需调整一下调用顺序即可; 第二,中文版关于解密时讲的不够详细,最起码缺少一个示意框架(英文版中就有,而且还有由初始密钥生成可用的16子密钥、加密,这个很好!!!)。一开始由于我手中有一个不太了解的但可以实现加解密的代码
(
代码中标注:
Provided by 王俊川, Northeastern University ()
Email:
This product is free for use.
)(可能就是他写的吧,由于已经注明可以免费使用,所以我想也不存在侵权吧 呵呵。)他的代码中的解密方法跟中文版所讲的解密方法是不同的,此时,主观感觉就是要么代码是非标准的,要么中文版的原理有问题(至少是一个变种),此时想起了找原文看,看过英文版的原文,才知道手中代码是一个变体,不是标准的DES加密算法,以后大家如果有人使用那个代码时,请留点神。
看完英文版的原理后,再回头看中文版的,就觉得中文版的没把关键部分翻译出来。添加的备注也是多余的,尤其是解密那段的右移与最下面讲的改变子密钥的调用顺序表面呈现矛盾,对于初学者,很可能觉得莫名奇妙,那么,这就是一种误导了。
对于DES,还有一点值得注意: 我们在设计代码(C或C++)时,很少用位变量,对于实现DES算法,在定义密钥以及明文缓冲区时,一般会选择字符型数据,那么这就出现了一个问题---我们该按什么样的顺序把字节序列转成位序列呢?? 很显然,一般地,有两种方法,一种是从高到低取出来依次向后排序,一种是从低到高取出来依次向后排序,两种方式都可以实现加解密,但是结果不同。标准的DES算法是什么呢? 它是按照第一种方式进行的。
最后,我想说的是,通过这几天的研究,我发现DES加密可以有很多种变体,这对用户来说是一件好事,可以自定义自己的加解密算法而又不会轻易的被破解。如果有高人看到这篇文章,小弟如有讲的不恰当的地方,还请不吝指导。
阅读(3366) | 评论(0) | 转发(0) |