DES算法流程

DES数据加密标准 (Data Encryption Standard)是一个16轮的Feistel型结构密码,它的分组长度为64比特,用一个56比特的**来加密一个64比特的明文串,输出一个64比特的密文串。其中,使用**为64比特,**位数是56比特,另8位用作奇偶校验,加密用的位数是48比特。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的**,因而它属于对称密码*。
DES算法流程

  1. 初始置换IP
  2. 生成16个48位的子**
  3. 16轮feistel结构迭代
    a) 扩展置换E
    b) S盒代换
    c) 置换P
  4. 逆初始置换IP-1
    DES算法流程
    Feistel结构:feistel结构把任何函数(一般称为F函数,又称轮函数)转化为一个置换。
    子**的生成:子**K的生成大致分成三个过程:置换选择PC1,循环左移,置换选择PC2。
    Ln = R(n - 1);
    Rn = L(n - 1)⊕f(Rn-1,kn-1)
    1.初始置换
    DES算法使用64位的**key将64位的明文输入块变为64位的密文输出块,并把输出块分为L0、R0两部分,每部分均为32位。初始置换规则如下:
    注意:这里的数字表示的是原数据的位置,不是数据
    DES算法流程
    初始置换把64位明文的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。以此类推,最后一位是原来的第7位。
    M1=(123456789ABCDEF)16
    =(00000001 00100011 01000101 01100111 10001001 10101011 11001101 11101111)2
    经过IP置换,并分成左右两部分,结果为:
    L0=11001100 00000000 11001100 11111111
    R0=11110000 10101010 11110000 10101010
    2.生成16个48位的子**
    DES算法由64位秘钥产生16轮的48位子秘钥。在每一轮的迭代过程中,使用不同的子秘钥。
    DES算法流程
    a、在DES中,每一轮迭代都使用了一个轮**。轮**是从用户输入的**k(64位)产生的。实用**是56位,另8位是奇偶校验位:输出**k的第8 , 16 , …,64位为奇偶校验位(每一字节的最后一位),这些位的值使得每个字节恰好包含了奇数个1,这样如果输入**中某个字节中存在一个错误,奇偶校验可以帮助查到这些错误。根据选择置换PC-1将这56位分成两块C0(28位)和D0(28位);
    b、将C0和D0进行循环左移变化(注:每轮循环左移的位数由轮数决定),变换后生成C1和D1,然后C1和D1合并,并通过选择置换PC-2生成子**K1(48位);
    c、C1和D1在次经过循环左移变换,生成C2和D2,然后C2和D2合并,通过选择置换PC-2生成**K2(48位);
    d、以此类推,得到K16(48位)。但是最后一轮的左右两部分不交换,而是直接合并在一起R16L16,作为逆置换的输入块。其中循环左移的位数一共是循环左移16次,其中第一次、第二次、第九次、第十六次是循环左移一位,其他都是左移两位。
    DES算法流程
    **置换选择PC-1(子秘钥的生成)
    操作对象是64位秘钥,初始**K=(123DAB779F658067)16
    =(00010010 00111101 10101011 01110111 10011111 01100101 10000000 01100111)2
    64位秘钥通过缩小选择换位表1的变换变成56位。如下:
    DES算法流程
    再将56位秘钥分成C0和D0:
    DES算法流程
    C0=(0101010 0101010 0010101 1100001)2
    D0=(1001110 1101110 1000010 1101011)2
    根据轮数,将Cn和Dn分别循环左移1位或2位
    循环左移每轮移动的位数如下:
    第一轮是循环左移1位。循环左移1位后如下:
    DES算法流程
    C1=(1010100 1010100 0101011 1000010)2
    D1=(0011101 1011101 0000101 1010111)2
    C1和D1合并之后,再经过置换选择表2生成48位的子秘钥K1。置换选择表2(PC-2)如下:
    去掉第9、18、22、25、35、38、43、54位,从56位变成48位,再按表的位置置换。
    DES算法流程
    K1=(000011 100011 001001 101100 011011 010010 011100 011101)
    C1和D1再次经过循环左移变换,生成C2和D2,C2和D2合并,通过PC-2生成子秘钥K2。
    以此类推,得到子秘钥K1~K16。需要注意其中循环左移的位数。
    3.F轮函数
    将明文进行完初始置换IP后,进入轮函数F。轮函数F中包含运算(扩展置换E、S盒代换、置换IP)
    DES算法流程
    R0=11110000 10101010 11110000 10101010
    K1=000011 100011 001001 101100 011011 010010 011100 011101
    通过扩展置换E,数据的右半部分R0从32位扩展到48位。扩展置换改变了位的次序,重复了某些位。
    扩展置换的目的:
    a、产生与秘钥相同长度的数据以进行异或运算,R0是32位,子秘钥是48位,所以R0要先进行扩展置换之后与子秘钥进行异或运算;
    b、提供更长的结果,使得在替代运算时能够进行压缩。
    DES算法流程
    E(R0)=011110 100001 010101 010101 011110 100001 010101 010101
    E(R0)⊕K1=011101 000010 011100 111001 000101110011 001001 001000
    S盒代换
    在密码函数f (R , k)中有8个S盒,称为8个不同的选择函数,分别用S1,S2,…S8表示。每个S盒都是将6位作为输入,得到一个4位块作为输出。
    以S1为例,若B是6位的一个块,则S1(B)计算如下:B的第一和最后一位表示从0到3之间的二进制数,令该数为i ;而B的中间4位表示从0到15之间的二进制数,令该数为j;在该表S1中查第i行j列的数,它是从0到15之间的一个数,且唯一地由4位块代表,则该块就是输入B的S1的输出S1(B)例如对于输入为101000而言,行是10,即第2行。而列是由0100确定,即第5列,S1盒的第2行与第5列的交叉处即为B,因而输出为1101,因此1101就是S盒S1在输入为101000时的输出。
    在f ( R , k )的计算中,它将由模2加运算得到的b1,b2,…,b48按每6个一组共
    分为8组,顺序记为B1,B2,…,B8它们分别经过8个选择函数 Si运算变成C1,C2,…,C32即
    S1(B1)S2(B2)…S8(B8) = C1,C2,…,C32
    DES算法流程
    E(R0)⊕K1=011101 000010 011100 111001 000101110011 001001 001000
    S1的输入为011101,第一位和第六位组成行,行选为01(即第1行),中间四位组成列,列选为1100(即第12列,8+4),行列交叉位置的数为9,其4位二进制表示为1001,所以S1的输出为1001。
    DES算法流程
    S2的输入为000010,第一位和第六位组成行,行选为00(即第0行),中间四位组成列,列选为0001(即第1列),行列交叉位置的数为1,其4位二进制表示为0001,所以S2的输出为0001。
    S盒的32bit输出为:
    S(E(R0)⊕K1)=0011 0001 0010 1100 0010 1110 0100 0110
    再经过P盒置换,S-盒代替运算,每一盒得到4位,8盒共得到32位输出。这32位输出作为P盒置换的输入块。
    P盒置换将每一位输入位映射到输出位。任何一位都不能被映射两次,也不能被略去。
    经过P-1盒置换的结果与最初64位分组的左半部分异或。
    DES算法流程
    得到函数的输出:
    f(R0,K1)=00010000 00110010 01010010 11101110
    在初始置换IP中,得知:
    L0=11001100 00000000 11001100 11111111
    通过如下运算可得到第一轮迭代输出结果的左右两部分为:
    R1=L0⊕f(R0,K1)=11011100 00110010 10011110 00010001
    L1=R0=11110000 10101010 11110000 10101010
    4.逆初始置换IP-1
    将初始置换进行16次的迭代,即进行16层的加密变换,这个运算过程我们暂时称为函数f。得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。以此类推,逆置换规则如下
    DES算法流程
    第16轮迭代输出结果的左右两部分为:
    R16=01110010 00010011 01001111 10010011
    L16=10001111 01011110 00000011 10111100
    V=IP-1(R16L16)=10011101 11111101 10100110 10100110 01110011 01000010 01100100 10000011
    微信公众号链接