the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


DES加密算法学习前奏

作者:the5fire | 标签:       | 发布:2010-11-19 5:24 p.m. | 阅读量: 7410, 7285
这几天看了一下DES加密,认真看的话这个算法并不难,有时候觉得困难时因为自己看不下去。茫茫人海,和己者寡。

des00

要学习DES加密算法,我觉得有几点是要先了解的,下面一一列出来:

1. 模2加运算
这个是比较好理解的,就是两个数相加然后除2取余。

2. 理解其中的置换
一开始的时候就会对明文进行置换,通过初始置换IP:
des01

这个表的含义就是,第一个58就是你明文中的第58个元素,你要放到1的位置,然后把明文中第50个元素放到2的位置,以此类推。

3. 子密钥的生成
des02

子密钥生成分为三步走:
第一步,先把密钥中的奇偶校验为去掉,然后根据选择置换PC-1讲剩下的密钥分成两块C0和D0;
第二步,将C0和D0进行循环左移变换,变换后生成C1和D1,然后C1和D1合并,通过选择置换PC-2生成子密钥K1;
第三步,C1和D1再次经过循环左移变换,生成C2和D2,C2和D2合并,通过选择置换PC-2生成子密钥K2;
第四步,以此类推,需要注意其中循环左移的位数,一共是循环左移十六次,其中LS1(第一次),LS2(第二次),LS9,LS16是循环左移一位,其他的都是左移两位。

4. DES的核心——加密函数

加密函数的加密过程也可以通过三步走:
第一步,将R0通过位选择函数E置换,其实这是一个扩充的置换,因为R0本身是32位的(这点先记住就行了,后一篇文章会说),而生成的子密钥是48位的,因此需要扩充一下,方能按位运算。
第二步,将扩充完的R0和子密钥K1进行模2加运算,得到48位的一个串,把这个串从左到右分为8组,每组6个字符。这里设8组分别为B1,B2,B3,B4,B5,B6,B7,B8。其中Bj=b1b2b3b4b5b6。
第三步,通过S盒来收缩,把每组中的b1b6放一块,换算为十进制,b2b3b4b5放一块,也换算为十进制。b1b6代表S盒中的行标,b2b3b4b5代表列标。比如说B1=011111,那么b1b6就等于十进制的1,b2b3b4b5等于十进制的15,也就是对应表中的S1块中的第1行(注意不是0行),15列,也就是8,然后把8变为二进制1000。这就完成了S盒收缩变换,然后通过S盒输出的就是32位的一个串。
des03
第四步,把32位的串经过置换函数P的置换得到的结果就是这个核心函数的产物了。

至此,准备工作就做完了

- from the5fire.com
----EOF-----

微信公众号:Python程序员杂谈


其他分类: