文字讲解 http://www.cnblogs.com/songwenlong/p/5944139.html
视频讲解 http://v.youku.com/v_show/id_XMzYwNTM4NTY0.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2
第一步:
要加密的数据分割为若干以64bit为单位的数据,如果位数不够,那么补00或者FF,然后按照表1进行置换操作(矩阵旋转)
第二步:
把64位密钥按表2做置换,去除密钥中作为奇偶检验位的第8,16,24,32,40,48,56,64位,剩下的56位作为有效输入密钥.
表2
第三步
将56位有效密钥按表3左移位,总计进行16轮移操作,每一轮移位结束之后,得到的新的56位子密钥作为下一轮移位的有效密钥,总计得到16个56位的子密钥.
第一轮左移1位 1010->0101
第二轮左移1位 0101->1010
第三轮左移2位 1010->1010(结果不变)
......
......
......
最后生成16个56位的子密钥
第四步
按照表4对16个子密钥进行置换压缩,压缩后每个子密钥中的第9,18,22,25,35,38,43,54共8位数据会丢失.此步骤完成后得到的16
个48
位的子密钥.K[1],......k[16]
第三和第四步图解
第五步
将第一步生成的的有效数据的右半部分R[0]的32位数据根据表5进行置换,由原32位扩展到48位:
(表中的数字代表位,两列黄色数据是扩展的数据,可以看出,扩展的数据是从相邻两组分别取靠近的一位,4位变为6位。靠近32位的位为1,靠近1位的位为32。表中第二行的4取自上组中的末位,9取自下组中的首位。)
第六步
将扩展后的有效数据的新的R[1]和K[1]做异或运算得到16个48位的加密数据,把新的值记作B[1]...
相同为0
不同为1
第七步 S盒代替
将第六步产生的48位的加密数据分为8个6位的数据,按照表6取值,每6位压缩成4位,最终形成8个4位的数据,组合成新的32位的数据.
例如,假设S盒8的输入为110011,第1位和第6位组成的二进制数为11,对应于S盒8的第3行;第2位到第5位组成的二进制数为1001,对应于S盒8的第9列。S盒8的第3行第9列的数字为12,因此用1100来代替110011。注意,S盒的行列计数都是从0开始。
第八步 P盒置换
将第七步产生的32位的数据按照表7置换,生成新的32位的RR[1]数据
第十步
把RR[1]盒第一步产生的L[1]按位异或后的值赋给第一步产生的R[2],然后原来的R[1]值先给L[2],得到新的L[2]和R[2]
第十一步
回到第五步,重复运算到第十步,每轮计算由R[i],L[i],K[i]来计算.总计重复16轮结束,最终生成新的L[16]和R[16]
第十二步 IP-1末置换
合并L[16]和R[16]为64位的数据,然后按照表8做置换,生成最终加密数据
解密的时候一样步骤,只是在做第六步的时候,将K[16]变为K[1],依次类推倒用K[i]即可.