zoukankan      html  css  js  c++  java
  • DES加密

      DES采用了64位的分组长度和56位的密钥长度,是对称加密的一种。

      DES的理论进化主线是 1945年Shannon大神提出的交替使用混淆(使密文与密钥的统计关系变复杂)和扩散(使明文与密文的统计关系变复杂)的乘积密码(DES加密的核心思想)-->1960s的Feistel结构-->DES。实践主线是 1971年基于Feistel结构的LUCIFER算法-->Tuchman-Mayer方案(将LUCIFER的128位密钥简化为56位)-->1977年被采纳的DES(增加S盒,产生非线性)。

      下图为DES加密的整个机制

      

      DES加密操作分两块,明文加密以及生成子密钥两部分。

      上图左半部分描述了明文加密成密文的三个阶段。

      1、64位的明文经初始置换(IP)而重新排列。

      2、进行16轮的置换和转换(基于Feistel结构)。

      3、再做一次置换(IP-1,与初始置换互逆)。

      可逆验证    M=IP-1{F[IP(P)]}     

            IP-1{F[IP(M)]}= IP-1{F[IPIP-1{F[IP(P)]}]}=IP-1{FF[IP(P)]}=IP-1IP(P)=P

      结论,加密和解密的过程基本一致(F函数代表16轮转换的整体效果,实际上子密钥在加密和解密中顺序是相反的)

      上图右半部分是56位密钥的操作过程。

      1、密钥先做一个置换。

      2、再做16次包含循环左移和置换的操作组合,每次都产生一个子密钥Ki。每一轮的置换操作都完全相同,但由于循环左移而使得每个子密钥不同。

      

      下面介绍初始置换及其逆置换

      

      如上表,分别代表初始置换和初始置换的逆置换。表中数字包含1-64,代表输入的64位分组的每一比特在置换输出后的位置。

      很显然,以上两个置换确实是可逆的,如明文分组的第1位经初始置换后出现在第58位,而逆置换的第58位将输出到第1位。

       这个置换的原理实际上是对置换群的可逆操作。

      Feistel结构的加密与解密

      

      Feistel结构的加密算法将明文分组分成等长的左右两部分,这两半经过n轮迭代后组成密文分组。每一轮的迭代操作都完全相同,解密过程本质上与加密过程操作是一致的,只是子密钥的使用顺序与加密过程完全相反。因此,为了研究加密与解密过程的可逆性,可将问题简化为只有一轮的迭代,如下图。

      

      feistel结构的可逆性,其运用的数学原理是异或的几个基本性质

           [AB]C=A[BC]        

        AA=0       

        A0=A

      以 i 轮为例

              

        加密时有                                              解密时有

          Li=Ri-1                    Li’=Ri-1‘   ==>   Li’=Li=Ri-1  

          Ri=Li-1F(Ri-1,Ki)                               Ri’=Li-1F(Ri-1’,Ki)   ==>  Ri’=RiF(Li,Ki)=Li-1F(Ri-1,Ki)F(Ri-1,Ki)=Li-1

        结论:每轮加密和解密的中间结果都完全一样,且与F函数无关。而F函数越复杂,Ri与Li-1的关系越复杂,因而越难被破解。

        

      DES第二阶段每轮变换的详细过程

      

      由于轮密钥长48位,R是32位,首先要将R进行置换扩展为48位,其中有16位是重复的,如用下表进行置换扩展。

      

      然后将扩展后的48位与轮密钥进行异或,所得结果再用一个替代函数作用(S盒)并输出32位。下图解释了S盒在函数F中的作用。

      

      代替函数由8个S盒组成,S盒的变换参见下表。

      

      每个S盒都输入6位,输出4位。盒Si输入的第1位和最后1位组成一个2位的二进制数,用来选择S盒4行代替值中的一行,中间4位用来选择16列中的某一列。行列交叉处的十进制转换为二进制之后可得到输出的4位二进制数。

      S盒实现了非线性的特性。通过S盒,不同的输入可以有相同的输出,进一步增加了明文与密文之间的映射关系的复杂度,使得破解更加艰难。

      最后再做一次置换后输出,该置换例子如下表。

      

      密钥产生

      1、首先输入64位密钥,密钥各位分别标记为1-64。从64位中选择56位作为有效密钥,如选择下表阴影部分。

      

      2、将所得56位有效密钥进行置换并划分成等长的两部分C0和D0,如下表。

      

      3、每轮进行迭代时,Ci-1和Di-1分别循环左移一位或者两位,具体移位数见下表。

      

      4、对移位后的值再做一次置换,如下表。

      

      

  • 相关阅读:
    Netty实例
    八大排序算法Java实现
    在linux服务器上初步定位java接口耗时
    Manjaro 18.X 配置记录
    Linux下搭建ELK和初步使用
    ubuntu下docker简单安装rabbitmq
    Linux禁启用ping的方法
    ubuntu下docker简单安装mysql
    Ubuntu18优化桌面版的运行速度
    ubuntu下webpack初始化vue项目
  • 原文地址:https://www.cnblogs.com/block2016/p/5502544.html
Copyright © 2011-2022 走看看