这几天看了一下DES加密,认真看的话这个算法并不难,有时候觉得困难时因为自己看不下去。茫茫人海,和己者寡。
<!--[endif]-->
要学习DES加密算法,我觉得有几点是要先了解的,下面一一列出来:
<!--[if !supportLists]-->1. <!--[endif]-->模2加运算
这个是比较好理解的,就是两个数相加然后除2取余。
<!--[if !supportLists]-->2. <!--[endif]-->理解其中的置换
一开始的时候就会对明文进行置换,通过初始置换IP:
<!--[endif]-->
这个表的含义就是,第一个58就是你明文中的第58个元素,你要放到1的位置,然后把明文中第50个元素放到2的位置,以此类推。
<!--[if !supportLists]-->3. <!--[endif]-->子密钥的生成
<!--[endif]-->
子密钥生成分为三步走:
第一步,先把密钥中的奇偶校验为去掉,然后根据选择置换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是循环左移一位,其他的都是左移两位。
<!--[if !supportLists]-->4. <!--[endif]-->DES的核心——加密函数 <!--[if !vml]--><!--[endif]-->
加密函数的加密过程也可以通过三步走:
第一步,将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位的一个串。
<!--[endif]-->
第四步,把32位的串经过置换函数P的置换得到的结果就是这个核心函数的产物了。