其实比起叙述编写DES加密程序过程,我更家愿意去写成功的程序中输出的加密的具体的实例数据,因为这个过程实在是。。。。。有些程序是这样,你知道怎么去编写,你也能清晰的知道你将需要多少的时间去完成这个程序,而事实上,你也做到了,而有些程序,你知道它并不难写,但是就是本来1个小时可以写好的事情,你却使用了超过4个小时的时间去编写。还有些程序,写好了,写的过程基本没有出过啥差错,但是最后运行的时候常常出来一些莫名其妙的错误,而有些程序呢,可以编写,而且编写程序的过程中经常出现错误,想要出现的答案,或者说程序运行的记过就在嘴边了,就在手指上了,屏幕上出现的结果就是不对,于是反复的调试,反复的调试。。。。但是一旦调成,它以后的运行就错不了。
而DES这种编程,在我的经历中,就是两个后者。
DES加密对我们并不是啥高深的词,不过如果你想深入细细的研究它,恩,你还是需要一定的时间和一定的脑细胞的牺牲的。不过加密就是这样,其实就是数学的变换,各种变换,那些公开和广泛使用的加密算法,肯定不会那么简单,因为他们需要抵挡的密码的攻击是各种各样的,也是出自各种目的的,使用的工具也是各不相同的。
我并不打算把这样一个纠结的过程一步一步详细的叙述出来,如果是你,相信你也不会,但是其中噢乖出现的一些需要耗费很多的时间去寻找出来的错误,是需要去分析的,这也是为了让以后的编程的效率更高,也是为了更少的“低级”的错误的频繁的发生。
首先还是简略的介绍一下Des的加密的流程,背后的原理我没有研究,如果有兴趣,可以探讨一下,首先说明一点,Des是面向2进制的算法,恩,这个好像并没有啥问题,不过这个确实是有一定的限制的,在具体的应用的程序的编写过程中,常常会受到这个的牵制,二进制,化为我们能够懂得的内容,复原远比拆开更加的困难。
这里叙述其中的一个最小最基础的操作,也就是对64个二进制码加密,实际的应用中,不难想象,文本流可以进行截断,然后64位64位的进行加密,最后拼接成一个完整的文本,好了,进入正题。
密钥的位数也是64为,64个二进制码,而用户输入的就是一个8位的字符串,然后每一位就可以拆分成8位的二进制的码,然后我们就开始了具体的加密。
在初开始,明文,也就是需要被加密的内容(这里的内容就是指二进制的码,以后同此,不再说明),还有用于加密的密钥,就已经变得面目全非了,这个是由于在开始的时候分别对他们两者进行了不同的方式的转换,重新的排列,其中密钥的处理最复杂,分别叙述。
加密中使用的密钥,需要16个,当然,不是需要用户输入16个,而是根据前面的输入的密钥产生16个,这样不是有很多重复吗?不是的,因为产生的过程并不是简单的组合,子密钥的产生过程包括了置换,循环位移,图片如下:
置换,他的意思就是对密钥进行重新排列,这样的目的除了让其面目全非,更多是安全上的考虑,你可能要问,这种置换的格式或方法参数是固定的吗?是的。
具体的参数这里不给出,网上和教科书中也有很多的涉及,所以首先,我们就需要写一个生产16个密钥的函数了。
然后就是明文的“再次“产生,这里对于明文没有那么繁琐的步骤,只是一个置换,将数据打乱重新组合,变为左32位和右32位。
这样的两个产生函数之后,就是正式的加密,而这里也是编程的过程中需要注意最多的地方,因为在这里犯下“低级”错误的概率是最大的。
分两张给出过程:
总共是16轮的加密过程,这些过程大同小异,所以只需要看懂一个就可以了,在编程中,就是用循环的结构,来完成这样的过程。
就第一轮而言,左右各32位的内容,然后经过各自的运算,把结果值传递给下一组左右32位的内容,这样,进行16轮,最终得到需要的结果。
不过图中有一个错误,这个错误也是后来发现的,并且也是十分致命的,那就是在即将要出结果的最后一轮中,规则有一点的改变,那就是L16不是等于R15,而是反过来,R16等于R15,然后L16等于另一个值,好了,在之前的循环中,主要是对于R的赋值的运算有一些复杂,其中包含一个模2加(就是各位异或),还有一个关键的加密函数,这个函数中使用到之前产生的密钥,并且要用到S盒,S盒是个神奇的东西,有了它,DES中产生了非线性的因素,这样才能对安全达到一定的保证,否则就不好说了。
S盒的具体内容可以在别的地方看到,原理和流程就不详细说了,在编程的时候,这里一般不会出问题,问题要出也是主要在对于位的操作上,不过有很多的例程可以参考,所以不再叙述。
文章评论(0条评论)
登录后参与讨论