DES算法实现

 

实验需求

DES算法实现

算法原理

DES算法为密码*中的对称密码*,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码*加密算法。 明文按64位进行分组,**长64位,**事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个**都有奇数个1)分组后的明文组和56位的**按位替代或交换的方法形成密文组的加密方法。

总体结构

DES算法实现

  1. 求子钥K1–K16 
    K –> 置换得K+ –> 得C0,D0 –> 左移求C1D1–C16D16 –> 置换得K1–K16

  2. 利用子钥求L16R16 
    (1)M–> 置换得M+ –> 得L0,R0

    (2)进入16次循环: 
    Rn拓展置换(32->48)–> 结果异或Kn+1 –> 异或后结果进入S盒(48->32)–> S盒输出进行P置换 –> 结果异或Ln –> 结果赋给Rn+1,Ln+1 = Rn

    (3)得到L1R1–L16R16

  3. 生成密文 
    L16R16 –> R16L16 –>位置交换表置换得密文

  4. 解密过程 
    解密过程基本与加密过程相同,不过,加密利用子钥的顺序为K1—K16,解密过程利用子钥的顺序为K16—K1。

模块分析

求子钥K1–K16

DES算法实现

  1. 将**KEY(64位)转换成8*8矩阵便于后续计算
  2. 舍弃奇偶校验位得8*7矩阵K
  3. 通过8*7的交换规则表(perm_key),输入矩阵K,输出结果K+
  4. 将K+(8*7),上下分解为C0,D0(4*7)两个矩阵
  5. 根据下表,在每一轮Cn,Dn被赋值为Cn-1左移x位后的结果。重复16次得C1D1 – C16D16

DES算法实现

  1. Kn = CnDn(n = 1,2,……,16)
  2. 通过8*6的交换规则表(perm_K),输入矩阵Kn(n = 1,2,……,16),输出结果Kn+(n = 1,2,……,16)
  3. 子钥为Kn+(n = 1,2,……,16)

求L16R16

DES算法实现

  1. 将**M(64位)转换成8*8矩阵便于后续计算
  2. 通过8*8的交换规则表(perm_ip),输入矩阵M,输出结果M+
  3. 将M+(8*8),上下分解为L0,R0(4*8)两个矩阵
  4. 进入循环,循环次数为16,(n = 1,2,……,16): 
    (1)通过6*8的交换规则表(perm_R),输入矩阵Rn(8*4),输出结果Rn+(8*6) 
    (2)Rn+ = R+ 异或 Kn+1(子钥) 
    (3)通过4*16的S盒(perm_S),输入矩阵Rn+(8*6),输出结果Rn+(8*4)。 
    S盒具体规则如下: 
    ① 对于矩阵Rn+(8*6),每一行6个为一组,共8组。 
    ② 针对每组的6位数,每组中第一位和最后一位组成的二进制代表S盒行数,中间4位组成的数代表列数。 
    ③根据行数列数,对应相应组数的S盒中的十进制数 
    ④将十进制数转为4位二进制数,替代该组中原6位二进制数 
    (4)通过8*4的P盒(perm_P),输入矩阵Rn+,输出结果Rn+ 
    (5)Rn+ = Rn+ 异或Ln 
    (6)Rn+1 = Rn+ Ln+1 = Rn
  5. 经过16次循环得,L16、R16

生成密文

  1. 将R16(8*4)、L16(8*4),合并成LR(8*8)
  2. 通过8*8的交换规则表(perm_LR),输入矩阵LR,输出结果LR+
  3. 将LR+(8*8).转换成16进制数(long long),得到密文

数据结构

  1. 所有密码变化均用二维数组存储,方便变化计算 
    DES算法实现‘’
  2. 所有规则交换表,P盒,S盒均存储为二维数组,与步骤1统一方便计算 
    DES算法实现‘’ 
    DES算法实现 ‘’ 
    DES算法实现 ‘’
  3. 16位密码存储采用long long 
    DES算法实现

C语言源码重要函数

DES算法实现

DES算法实现

DES算法实现

DES算法实现

DES算法实现

实验结果

加密过程

DES算法实现

解密过程

DES算法实现

代码实现

https://github.com/pygmelion/DES-